对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 Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
python&MongoDB爬取图书馆借阅记录
Feb 05 Python
django1.11.1 models 数据库同步方法
May 30 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
Jul 13 Python
python在回调函数中获取返回值的方法
Feb 22 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
Python json转字典字符方法实例解析
Apr 13 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
Apr 21 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 Python
使用tensorflow 实现反向传播求导
May 26 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获取时间排除周六、周日的两个方法
2014/06/30 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
jQuery 加上最后自己的验证
2009/11/04 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
动态加载js、css的简单实现代码
2016/05/26 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
Python中的is和id用法分析
2015/01/26 Python
对于Python的框架中一些会话程序的管理
2015/04/20 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
python实现浪漫的烟花秀
2019/01/30 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
python利用faker库批量生成测试数据
2020/10/15 Python
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
优秀小学生家长评语
2014/01/30 职场文书
小学运动会开幕词
2015/01/28 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL