基于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运行的17个时新手常见错误小结
Aug 07 Python
Python利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
python执行get提交的方法
Apr 29 Python
Python引用模块和查找模块路径
Mar 17 Python
全面理解Python中self的用法
Jun 04 Python
Python中多线程的创建及基本调用方法
Jul 08 Python
利用Python中unittest实现简单的单元测试实例详解
Jan 09 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
Dec 21 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
Feb 25 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 Hash函数,增强密码安全
2011/02/25 PHP
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
thinkPHP5.0框架安装教程
2017/03/25 PHP
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
python使用cookie库操保存cookie详解
2014/03/03 Python
跟老齐学Python之Python文档
2014/10/10 Python
机器学习10大经典算法详解
2017/12/07 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
tensorflow mnist 数据加载实现并画图效果
2020/02/05 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
numpy库reshape用法详解
2020/04/19 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
机械工程师的岗位职责
2013/11/17 职场文书
职业生涯规划怎么写
2013/12/29 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
钱学森观后感
2015/06/04 职场文书
单位接收证明格式
2015/06/18 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python