基于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的web框架中编写创建日志的程序的教程
Apr 30 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
记一次python 内存泄漏问题及解决过程
Nov 29 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
python使用requests.session模拟登录
Aug 09 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
Python和Bash结合在一起的方法
Nov 13 Python
Python的collections模块真的很好用
Mar 01 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
提问的智慧
2006/10/09 PHP
PHP简单系统查询模块代码打包下载
2008/06/07 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
2010/05/21 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
vue组件学习教程
2017/09/09 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
python创建列表并给列表赋初始值的方法
2015/07/28 Python
玩转python爬虫之正则表达式
2016/02/17 Python
深入理解python try异常处理机制
2016/06/01 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
python实现飞机大战小游戏
2019/11/08 Python
Python解析json代码实例解析
2019/11/25 Python
Python解析多帧dicom数据详解
2020/01/13 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
大四自我鉴定范文
2013/10/06 职场文书
师范大学应届生求职信
2013/11/21 职场文书
大学生职业生涯规划书范文
2014/01/14 职场文书
一份创业计划书范文
2014/02/08 职场文书
考核工作实施方案
2014/03/30 职场文书
纪律教育月活动总结
2014/08/26 职场文书
匿名信格式范文
2015/05/27 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
MYSQL如何查看进程和kill进程
2022/03/13 MySQL