基于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中使用Flask、MongoDB搭建简易图片服务器
Feb 04 Python
Python List cmp()知识点总结
Feb 18 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
在notepad++中实现直接运行python代码
Dec 18 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
python文件和文件夹复制函数
Feb 07 Python
python连接mongodb集群方法详解
Feb 13 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
python 实现倒计时功能(gui界面)
Nov 11 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
python3中apply函数和lambda函数的使用详解
Feb 28 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
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
PHP进程通信基础之信号
2017/02/19 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
js 单引号 传递方法
2009/06/22 Javascript
javascript 计算两个整数的百分比值
2009/12/26 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
node跨域请求方法小结
2017/08/25 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
深入Python解释器理解Python中的字节码
2015/04/01 Python
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
详解python做UI界面的方法
2019/02/27 Python
python-视频分帧&多帧合成视频实例
2019/12/10 Python
windows下python安装pip方法详解
2020/02/10 Python
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
医学生求职自荐信
2013/10/25 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
还款承诺书范文
2014/05/20 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android