基于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利用elaphe制作二维条形码实现代码
May 25 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 Python
Python实现二维有序数组查找的方法
Apr 27 Python
Python实现将Excel转换为json的方法示例
Aug 05 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 Python
Django视图扩展类知识点详解
Oct 25 Python
详解从Django Allauth中进行登录改造小结
Dec 18 Python
基于Python获取照片的GPS位置信息
Jan 20 Python
python json load json 数据后出现乱序的解决方案
Feb 27 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
Python系统公网私网流量监控实现流程
Nov 23 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
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
WebPack基础知识详解
2017/01/16 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
Python安装第三方库的3种方法
2015/06/21 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
浅谈Django REST Framework限速
2017/12/12 Python
Python3实现从排序数组中删除重复项算法分析
2019/04/03 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
jupyter 导入csv文件方式
2020/04/21 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
求职自荐书范文
2013/12/04 职场文书
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python
总结高并发下Nginx性能如何优化
2021/11/01 Servers
Kubernetes控制节点的部署
2022/04/01 Servers