对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 运算符 供重载参考
Jun 11 Python
Python批量转换文件编码格式
May 17 Python
Python_LDA实现方法详解
Oct 25 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
Python Django基础二之URL路由系统
Jul 18 Python
python类中super() 的使用解析
Dec 19 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
Jan 20 Python
python 函数中的参数类型
Feb 11 Python
Python实现AI自动抠图实例解析
Mar 05 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 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和XSL stylesheets转换XML文档
2006/10/09 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
php修改数组键名的方法示例
2017/04/15 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
Javascript 刷新全集常用代码
2009/11/22 Javascript
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
python调用cmd命令行制作刷博器
2014/01/13 Python
Python获取脚本所在目录的正确方法
2014/04/15 Python
Python对HTML转义字符进行反转义的实现方法
2019/04/28 Python
python绘制多个子图的实例
2019/07/07 Python
Python 处理文件的几种方式
2019/08/23 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
计算机网络及管理学专业求职信
2014/06/05 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
瘦西湖导游词
2015/02/03 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
2015年班干部工作总结
2015/04/29 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL