基于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使用分治法实现求解最大值的方法
May 12 Python
python PIL模块与随机生成中文验证码
Feb 27 Python
使用Python判断质数(素数)的简单方法讲解
May 05 Python
Python 文件操作的详解及实例
Sep 18 Python
python实现机器人行走效果
Jan 29 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
Python时间序列处理之ARIMA模型的使用讲解
Apr 02 Python
python实现kNN算法识别手写体数字的示例代码
Aug 16 Python
python3通过qq邮箱发送邮件以及附件
May 20 Python
Python自动创建Excel并获取内容
Sep 16 Python
Python实现石头剪刀布游戏
Jan 20 Python
python爬取某网站原图作为壁纸
Jun 02 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学习笔记之 函数声明
2011/06/09 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
php中session退出登陆问题
2014/02/27 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
php批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
PHP对象实例化单例方法
2017/01/19 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
json的使用小结
2016/06/08 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
webpack踩坑之路图片的路径与打包
2017/09/05 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
python内存动态分配过程详解
2019/07/15 Python
python实现批量命名照片
2020/06/18 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
医院护士的求职信范文
2013/12/26 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
后进生评语大全
2015/01/04 职场文书
三孔导游词
2015/02/05 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
Python 发送SMTP邮件的简单教程
2021/06/24 Python
springboot临时文件存储目录配置方式
2021/07/01 Java/Android