前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于PyTorch的permute和reshape/view的区别介绍

基于PyTorch的permute和reshape/view的区别介绍

作者头像
砸漏
发布2020-10-21 10:14:39
1.6K0
发布2020-10-21 10:14:39
举报
文章被收录于专栏:恩蓝脚本

二维的情况

先用二维tensor作为例子,方便理解。

permute作用为调换Tensor的维度,参数为调换的维度。例如对于一个二维Tensor来说,调用tensor.permute(1,0)意为将1轴(列轴)与0轴(行轴)调换,相当于进行转置。

代码语言:javascript
复制
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中。

代码语言:javascript
复制
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用于演示。

代码语言:javascript
复制
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个通道,每个通道为2×1,例如第0张图片的第0号通道为[[0], [1]].

代码语言:javascript
复制
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.

示例如下:

代码语言:javascript
复制
    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的区别介绍就是小编分享给大家的全部内容了,希望能给大家一个参考。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
批量计算
批量计算(BatchCompute,Batch)是为有大数据计算业务的企业、科研单位等提供高性价比且易用的计算服务。批量计算 Batch 可以根据用户提供的批处理规模,智能地管理作业和调动其所需的最佳资源。有了 Batch 的帮助,您可以将精力集中在如何分析和处理数据结果上。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档