对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二分法搜索算法实例分析
May 11 Python
python修改操作系统时间的方法
May 18 Python
python基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
Python实现合并excel表格的方法分析
Apr 13 Python
python中for循环把字符串或者字典添加到列表的方法
Jul 20 Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 Python
Python中类似于jquery的pyquery库用法分析
Dec 02 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
利用Python实现斐波那契数列的方法实例
Jul 26 Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 Python
Python Matplotlib绘制条形图的全过程
Oct 24 Python
Python使用pandas导入csv文件内容的示例代码
Dec 24 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下escape解码函数的实现方法
2010/08/08 PHP
PHP 验证码的实现代码
2011/07/17 PHP
PHP调试函数和日志记录函数分享
2015/01/31 PHP
Thinkphp调用Image类生成缩略图的方法
2015/03/07 PHP
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
2013/03/05 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
推荐下python/ironpython:从入门到精通
2007/10/02 Python
pandas string转dataframe的方法
2018/04/11 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
关于VPN
2012/06/10 面试题
EJB发布WEB服务一般步骤
2012/10/31 面试题
语文教学感言
2014/02/06 职场文书
授权委托书怎么写
2014/04/03 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python
Java实现注册登录跳转
2022/06/16 Java/Android