对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列表推导式的使用方法
Nov 21 Python
详细解析Python中__init__()方法的高级应用
May 11 Python
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 Python
详解用Python实现自动化监控远程服务器
May 18 Python
Python中请不要再用re.compile了
Jun 30 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
Python调用Windows命令打印文件
Feb 07 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
Python如何爬取qq音乐歌词到本地
Jun 01 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
python pygame 愤怒的小鸟游戏示例代码
Feb 25 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以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
PHP反向代理类代码
2014/08/15 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
2016/04/14 Javascript
jQuery EasyUI 入门必看
2016/06/03 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
vue中实现左右联动的效果
2018/06/22 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
如何利用Node.js与JSON搭建简单的动态服务器
2020/06/16 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
2020/08/05 Python
Shein英国:女性时尚网上商店
2019/04/10 全球购物
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
公司前台辞职报告
2014/01/19 职场文书
探亲邀请信范文
2014/01/30 职场文书
生产文员岗位职责
2014/04/05 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
诚信承诺书
2015/01/19 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
护理培训心得体会
2016/01/22 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
Hive日期格式转换方法总结
2022/06/25 数据库