对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实现代码行数统计示例分享
Feb 10 Python
python使用PIL模块实现给图片打水印的方法
May 22 Python
Python实现堆排序的方法详解
May 03 Python
深入解析Python编程中super关键字的用法
Jun 24 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
python实现log日志的示例代码
Apr 28 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 Python
Django的用户模块与权限系统的示例代码
Jul 24 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 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
PHP4实际应用经验篇(5)
2006/10/09 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
php 常用类汇总 推荐收藏
2010/05/13 PHP
php使用cookie显示用户上次访问网站日期的方法
2015/01/26 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
PHP registerXPathNamespace()函数讲解
2019/02/03 PHP
jquery 选择器部分整理
2009/10/28 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
Vue源码解析之数组变异的实现
2018/12/04 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
python学习之编写查询ip程序
2016/02/27 Python
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
django实现用户登陆功能详解
2017/12/11 Python
python实现飞机大战微信小游戏
2020/03/21 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
django 模型中的计算字段实例
2020/05/19 Python
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
c++工程师面试问题
2013/08/04 面试题
年终工作总结范文2014
2014/11/27 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
如何用python绘制雷达图
2021/04/24 Python
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server