对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模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 Python
Python 常用 PEP8 编码规范详解
Jan 22 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
Nov 14 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
使用python 写一个静态服务(实战)
Jun 28 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
浅谈Python中re.match()和re.search()的使用及区别
Apr 14 Python
解决pytorch 交叉熵损失输出为负数的问题
Jul 07 Python
python通过cython加密代码
Dec 11 Python
PyCharm 安装与使用配置教程(windows,mac通用)
May 12 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连接SQLServer2005方法及代码
2013/12/26 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
php银联网页支付实现方法
2015/03/04 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
python根据日期返回星期几的方法
2015/07/06 Python
python构建自定义回调函数详解
2017/06/20 Python
python 全局变量的import机制介绍
2017/09/07 Python
python中列表和元组的区别
2017/12/18 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
值得收藏的10道python 面试题
2019/04/15 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
python代码能做成软件吗
2020/07/24 Python
python 如何停止一个死循环的线程
2020/11/24 Python
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
超市营业员求职简历的自我评价
2013/10/17 职场文书
思想汇报格式
2014/01/05 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
繁星春水读书笔记
2015/06/30 职场文书
丧事答谢词大全
2015/09/30 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL