基于PyTorch的permute和reshape/view的区别介绍


Posted in Python onJune 18, 2020

二维的情况

先用二维tensor作为例子,方便理解。

permute作用为调换Tensor的维度,参数为调换的维度。例如对于一个二维Tensor来说,调用tensor.permute(1,0)意为将1轴(列轴)与0轴(行轴)调换,相当于进行转置。

In [20]: a    
Out[20]:    
tensor([[0, 1, 2],  
  [3, 4, 5]])  
      
In [21]: a.permute(1,0) 
Out[21]:    
tensor([[0, 3],   
  [1, 4],   
  [2, 5]])

如果使用view(3,2)或reshape(3,2),得到的tensor并不是转置的效果,而是相当于将原tensor的元素按行取出,然后按行放入到新形状的tensor中。

In [22]: a.reshape(3,2) 
Out[22]:    
tensor([[0, 1],   
  [2, 3],   
  [4, 5]])  
      
In [23]: a.view(3,2) 
Out[23]:    
tensor([[0, 1],   
  [2, 3],   
  [4, 5]])

高维的情况

一般使用permute的情况都是在更高维的情况下使用,例如对于一个图像batch,其形状为[batch, channel, height, width],我们可以使用tensor.permute(0,3,2,1)得到形状为[batch, width, height, channel]的tensor.

我们构造一个模拟的batch用于演示。

In [25]: a=torch.arange(2*3*2*1).reshape(2,3,2,1) 
             
In [26]: a          
Out[26]:           
tensor([[[[ 0],    # 这是第0张“图片”的第0号通道的2个元素      
   [ 1]],         
             
   [[ 2],    # 这是第0张“图片”的第1号通道的2个元素      
   [ 3]],         
             
   [[ 4],    # 这是第0张“图片”的第2号通道的2个元素      
   [ 5]]],         
             
             
  [[[ 6],         
   [ 7]],         
             
   [[ 8],         
   [ 9]],         
             
   [[10],         
   [11]]]])

a的形状为[2,3,2,1],这个batch有2张“图片”,每张图片有3个通道,每个通道为2x1,例如第0张图片的第0号通道为[[0], [1]].

In [27]: a.permute(0,3,2,1)
Out[27]:
tensor([[[[ 0, 2, 4],
   [ 1, 3, 5]]],


  [[[ 6, 8, 10],
   [ 7, 9, 11]]]])
In [28]: a.permute(0,3,2,1).shape
Out[28]: torch.Size([2, 1, 2, 3])

形状为[2,3,2,1]的batch执行permute(0,3,2,1)交换维度之后,得到的是[2,1,2,3],即[batch, width, height, channel]

可以理解为,对于一个高维的Tensor执行permute,我们没有改变数据的相对位置,而只是旋转了一下这个(超)立方体。或者也可以说,改变了我们对这个(超)立方体的“观察角度”而已。

补充知识:pytorch: torch.Tensor.view ------ reshape

如下所示:

torch.Tensoe.view(python method, in torch.Tensor)

作用: 将输入的torch.Tensor改变形状(size)并返回.返回的Tensor与输入的Tensor必须有相同的元素,相同的元素数目,但形状可以不一样

即,view起到的作用是reshape,view的参数的是改变后的shape.

示例如下:

>>> x = torch.randn(4, 4)
>>> x.size()
torch.Size([4, 4])
>>> y = x.view(16)
>>> y.size()
torch.Size([16])
>>> z = x.view(-1, 8) # the size -1 is inferred from other dimensions
>>> z.size()
torch.Size([2, 8])

view_as:

tensor_1.view_as(tensor_2):将tensor_1的形状改成与tensor_2一样

以上这篇基于PyTorch的permute和reshape/view的区别介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
深入了解Python中pop和remove的使用方法
Jan 09 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 Python
Python3.6简单反射操作示例
Jun 14 Python
python+pandas+时间、日期以及时间序列处理方法
Jul 10 Python
朴素贝叶斯Python实例及解析
Nov 19 Python
python pytest进阶之fixture详解
Jun 27 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
python logging设置level失败的解决方法
Feb 19 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
python实现图片批量压缩
Apr 24 Python
Python Switch Case三种实现方法代码实例
Jun 18 #Python
Python3开发环境搭建详细教程
Jun 18 #Python
Python collections.defaultdict模块用法详解
Jun 18 #Python
python实现批量命名照片
Jun 18 #Python
pandas之分组groupby()的使用整理与总结
Jun 18 #Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 #Python
Python调用shell cmd方法代码示例解析
Jun 18 #Python
You might like
我的论坛源代码(八)
2006/10/09 PHP
PHP 事件机制(2)
2011/03/23 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
javascript 实现动态侧边栏实例详解
2016/11/11 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
vue.js之vue-cli脚手架的搭建详解
2017/05/05 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
详解Angular.js中$http拦截器的介绍及使用
2017/07/04 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
python 截取 取出一部分的字符串方法
2017/03/01 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
Python实现手绘图效果实例分享
2020/07/22 Python
css3一个简易的 LED 数字时钟实现方法
2020/01/15 HTML / CSS
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
中式餐厅创业计划书范文
2014/01/23 职场文书