对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客户端访问
Jun 09 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
python实现闹钟定时播放音乐功能
Jan 25 Python
python实现比较文件内容异同
Jun 22 Python
python求质数的3种方法
Sep 28 Python
Python实现常见的回文字符串算法
Nov 14 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
Python配置文件处理的方法教程
Aug 29 Python
python自动发微信监控报警
Sep 06 Python
django和flask哪个值得研究学习
Jul 31 Python
Python实现照片卡通化
Dec 06 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数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
php数组键名技巧小结
2015/02/17 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
angularjs指令之绑定策略(@、=、&)
2017/04/13 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
Vue $attrs & inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
读取nii或nii.gz文件中的信息即输出图像操作
2020/07/01 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
澳大利亚领先的在线葡萄酒零售商:Get Wines Direct
2018/03/27 全球购物
秘书英文求职信
2014/04/16 职场文书
三好生演讲稿
2014/09/12 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
2015年幼儿园班主任工作总结
2015/05/12 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫