基于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 图片验证码代码
Dec 07 Python
Python urlopen()函数 示例分享
Jun 12 Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 Python
Python pass详细介绍及实例代码
Nov 24 Python
Django使用paginator插件实现翻页功能的实例
Oct 24 Python
Python 3.8新特征之asyncio REPL
May 28 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
python代码xml转txt实例
Mar 10 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 Python
python文件名批量重命名脚本实例代码
Apr 22 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
一个SQL管理员的web接口
2006/10/09 PHP
php5中类的学习
2008/03/28 PHP
PHP 变量类型的强制转换
2009/10/23 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
php微信开发之图片回复功能
2018/06/14 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
房地产管理毕业生自荐信
2013/11/04 职场文书
政法大学毕业生自荐信范文
2014/01/01 职场文书
新春联欢会主持词
2014/03/24 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
三峡人家导游词
2015/01/31 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
初中英语教学随笔
2015/08/15 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL
学习nginx基础知识
2021/09/04 Servers