基于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单例模式实例解析
Aug 28 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
python组合无重复三位数的实例
Nov 13 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
关于Python3 lambda函数的深入浅出
Nov 27 Python
Python操作redis和mongoDB的方法
Dec 19 Python
Python魔术方法专题
Jun 19 Python
在Python中实现字典反转案例
Dec 05 Python
python实现进度条的多种实现
Apr 29 Python
使用python如何删除同一文件夹下相似的图片
May 07 Python
Python 匹配文本并在其上一行追加文本
May 11 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
PHPMailer安装方法及简单实例
2008/11/25 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
2014/01/07 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
Jquery搜索父元素操作方法
2015/02/10 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
对于防止按钮重复点击的尝试详解
2019/04/22 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
Python基于Tkinter实现的记事本实例
2015/06/17 Python
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
美国五金商店:Ace Hardware
2018/03/27 全球购物
生物学学生自我评价
2014/01/17 职场文书
求职自荐信的格式
2014/04/07 职场文书
夏季药店促销方案
2014/08/22 职场文书
党支部综合考察意见
2015/06/01 职场文书