对pytorch中x = x.view(x.size(0), -1) 的理解说明


Posted in Python onMarch 03, 2021

在pytorch的CNN代码中经常会看到

x.view(x.size(0), -1)

首先,在pytorch中的view()函数就是用来改变tensor的形状的,例如将2行3列的tensor变为1行6列,其中-1表示会自适应的调整剩余的维度

a = torch.Tensor(2,3)
print(a)
# tensor([[0.0000, 0.0000, 0.0000],
#    [0.0000, 0.0000, 0.0000]])
 
print(a.view(1,-1))
# tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]])

在CNN中卷积或者池化之后需要连接全连接层,所以需要把多维度的tensor展平成一维,x.view(x.size(0), -1)就实现的这个功能

def forward(self,x):
  x=self.pre(x)
  x=self.layer1(x)
  x=self.layer2(x)
  x=self.layer3(x)
  x=self.layer4(x)
    
  x=F.avg_pool2d(x,7)
  x=x.view(x.size(0),-1)
  return self.fc(x)

卷积或者池化之后的tensor的维度为(batchsize,channels,x,y),其中x.size(0)指batchsize的值,最后通过x.view(x.size(0), -1)将tensor的结构转换为了(batchsize, channels*x*y),即将(channels,x,y)拉直,然后就可以和fc层连接了

补充:pytorch中view的用法(重构张量)

view在pytorch中是用来改变张量的shape的,简单又好用。

pytorch中view的用法通常是直接在张量名后用.view调用,然后放入自己想要的shape。如

tensor_name.view(shape)

Example:

1. 直接用法:

>>> x = torch.randn(4, 4)
 >>> x.size()
 torch.Size([4, 4])
 >>> y = x.view(16)
 >>> y.size()
 torch.Size([16])

2. 强调某一维度的尺寸:

>>> z = x.view(-1, 8) # the size -1 is inferred from other dimensions
>>> z.size()
torch.Size([2, 8])

3. 拉直张量:

(直接填-1表示拉直, 等价于tensor_name.flatten())

>>> y = x.view(-1)
 >>> y.size()
 torch.Size([16])

4. 做维度变换时不改变内存排列

>>> a = torch.randn(1, 2, 3, 4)
>>> a.size()
torch.Size([1, 2, 3, 4])
>>> b = a.transpose(1, 2) # Swaps 2nd and 3rd dimension
>>> b.size()
torch.Size([1, 3, 2, 4])
>>> c = a.view(1, 3, 2, 4) # Does not change tensor layout in memory
>>> c.size()
torch.Size([1, 3, 2, 4])
>>> torch.equal(b, c)
False

注意最后的False,在张量b和c是不等价的。从这里我们可以看得出来,view函数如其名,只改变“看起来”的样子,不会改变张量在内存中的排列。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
在漏洞利用Python代码真的很爽
Aug 26 Python
Python学习笔记_数据排序方法
May 22 Python
wxpython实现图书管理系统
Mar 12 Python
python write无法写入文件的解决方法
Jan 23 Python
Python实现程序判断季节的代码示例
Jan 28 Python
Python根据成绩分析系统浅析
Feb 11 Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
使用python动态生成波形曲线的实现
Dec 04 Python
Python语法垃圾回收机制原理解析
Mar 25 Python
python 基于opencv 绘制图像轮廓
Dec 11 Python
Python+Appium实现自动抢微信红包
May 21 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 #Python
Pytorch 中的optimizer使用说明
Mar 03 #Python
解决pytorch 的state_dict()拷贝问题
Mar 03 #Python
解决pytorch 保存模型遇到的问题
Mar 03 #Python
解决pytorch 模型复制的一些问题
Mar 03 #Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 #Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 #Python
You might like
PHP 加密与解密的斗争
2009/04/17 PHP
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
PHP5 的对象赋值机制介绍
2011/08/02 PHP
php+ajax实现文章自动保存的方法
2014/12/30 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
详谈nodejs异步编程
2014/12/04 NodeJs
jQuery on方法传递参数示例
2014/12/09 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
深入浅出学习python装饰器
2017/09/29 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
python 生成图形验证码的方法示例
2018/11/11 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
python中什么是面向对象
2020/06/11 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
python+requests接口自动化框架的实现
2020/08/31 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
CSS3实现时间轴效果
2016/07/11 HTML / CSS
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
宣传策划类求职信范文
2014/01/31 职场文书
《胖乎乎的小手》教学反思
2014/02/26 职场文书
青岛导游词
2015/02/12 职场文书
环卫处个人工作总结
2015/03/04 职场文书
高质量“欢迎词”
2019/04/03 职场文书
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python
python 实现图片特效处理
2022/04/03 Python