对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中将字典转换成其json字符串
Jul 16 Python
使用Python中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
Python编程中用close()方法关闭文件的教程
May 24 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
python Django框架实现web端分页呈现数据
Oct 31 Python
使用Python打造一款间谍程序的流程分析
Feb 21 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
PyQt QMainWindow的使用示例
Mar 24 Python
python opencv通过按键采集图片源码
May 20 Python
Python闭包的定义和使用方法
Apr 11 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动态变量定义及使用
2015/06/10 PHP
jQuery.extend 函数详解
2012/02/03 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
Python字符串处理实现单词反转
2017/06/14 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
Django中使用Celery的教程详解
2018/08/24 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
Python实现京东秒杀功能代码
2019/05/16 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
机械绘图员岗位职责
2013/11/19 职场文书
一年级小学生评语
2014/04/22 职场文书
供货协议书
2014/04/22 职场文书
学习退步检讨书
2014/09/28 职场文书
个人批评与自我批评范文
2014/10/17 职场文书
办公经费申请报告
2015/05/15 职场文书
岁月神偷观后感
2015/06/11 职场文书
2019各种保证书范文
2019/06/24 职场文书
python - asyncio异步编程
2021/04/06 Python