对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 encode和decode的妙用
Sep 02 Python
用Python计算三角函数之acos()方法的使用
May 15 Python
Python中enumerate函数代码解析
Oct 31 Python
python SSH模块登录,远程机执行shell命令实例解析
Jan 12 Python
python 限制函数调用次数的实例讲解
Apr 21 Python
Numpy 改变数组维度的几种方法小结
Aug 02 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
python 实现控制鼠标键盘
Nov 27 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
Twig模板引擎用法入门教程
2016/01/20 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
JavaScript 格式字符串的应用
2010/03/29 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
Python 字符串操作方法大全
2014/03/11 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
解决Mac下使用python的坑
2019/08/13 Python
Python中turtle库的使用实例
2019/09/09 Python
使用python绘制温度变化雷达图
2019/10/18 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
校领导推荐信
2013/11/01 职场文书
新学期开学标语
2014/06/30 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
北京导游词
2015/02/12 职场文书
公司的力量观后感
2015/06/05 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书