对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如何压缩新文件到已有ZIP文件
Mar 14 Python
Python学习笔记之open()函数打开文件路径报错问题
Apr 28 Python
Python中一些不为人知的基础技巧总结
May 19 Python
python 读写文件,按行修改文件的方法
Jul 12 Python
Python对excel文档的操作方法详解
Dec 10 Python
Python中asyncio模块的深入讲解
Jun 10 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
python的range和linspace使用详解
Nov 27 Python
使用keras内置的模型进行图片预测实例
Jun 17 Python
python中可以声明变量类型吗
Jun 18 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
使用scrapy实现增量式爬取方式
Jun 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中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
php支付宝手机网页支付类实例
2015/03/04 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
8个必备的PHP功能开发
2015/10/02 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
常用js脚本
2006/12/03 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
js实现文章目录索引导航(table of content)
2020/05/10 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
python开发中range()函数用法实例分析
2015/11/12 Python
python安装requests库的实例代码
2019/06/25 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
自主招生自荐信格式
2013/12/03 职场文书
公司董事长职责
2013/12/12 职场文书
2014植树节活动总结
2014/03/11 职场文书
环保建议书
2014/03/12 职场文书
科研课题实施方案
2014/03/18 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
七年级作文之环保作文
2019/10/17 职场文书
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python