基于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 相关文章推荐
python3 shelve模块的详解
Jul 08 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
Python装饰器模式定义与用法分析
Aug 06 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
Python 处理图片像素点的实例
Jan 08 Python
django框架防止XSS注入的方法分析
Jun 21 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
Numpy之reshape()使用详解
Dec 26 Python
Python实现仿射密码的思路详解
Apr 23 Python
python支持多继承吗
Jun 19 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
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
jquery offset函数应用实例
2012/11/14 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
js实现常用排序算法
2016/08/09 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
Python中的Cookie模块如何使用
2020/06/04 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
C#笔试题和英文面试题
2013/02/07 面试题
《夜晚的实验》教学反思
2014/02/19 职场文书
政风行风建设责任书
2014/07/23 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
2016年国陪研修感言
2015/11/18 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers
js判断两个数组相等的5种方法
2022/05/06 Javascript