2021-02-25

Pytorch中有关维度转换的函数

view和reshape函数

通过这两个函数可以实现一个张量的维度改变,形状的变化是基于数组元素所决定的
View函数

Int:
import torch
a = torch.rand(2,1,2,1)
print(a)

Out:
tensor([[[[0.8683],
          [0.1275]]],


        [[[0.7866],
          [0.6923]]]])
          
Int:
a.view(2*1,2*1) #通过view函数将四维的数组转化为二维的数组

Out:
tensor([[0.8683, 0.1275],
        [0.7866, 0.6923]])

Reshape函数

Int:
import torch
a = torch.rand(12)
print(a)

Out:
tensor([0.2613, 0.6360, 0.5339, 0.1182, 0.9082, 0.7139, 0.8552, 0.2381, 0.8661,
        0.7234, 0.3255, 0.6287])

Int:
a.reshape(3,4)  #调用reshape函数改变数组的维度

Out:
tensor([[0.2613, 0.6360, 0.5339, 0.1182],
        [0.9082, 0.7139, 0.8552, 0.2381],
        [0.8661, 0.7234, 0.3255, 0.6287]])


Int:
a.reshape(2,2,3) #要注意的是形状的变化是基于数组元素所决定的

Out:
tensor([[[0.2613, 0.6360, 0.5339],
         [0.1182, 0.9082, 0.7139]],

        [[0.8552, 0.2381, 0.8661],
         [0.7234, 0.3255, 0.6287]]])

squeeze和unsqueeze函数

这两个函数方法可以实现tensor维度的减少和增加
可以主动复制内存的数据对repeat()函数中的每一个参数
代表着要拷贝几次,而expand函数可以进行tensor维度的扩
展从而改变tensor的维度,下面看代码实现:

Int:
import torch
a = torch.tensor([1.2,2.3]) #原来的为一维的张量
a.shape
a= a.unsqueeze(-1) #unsqueeze函数通过索引给任意维度间增添一个新维度
a.shape 

Out:
torch.Size([2]) 
tensor([[1.2000],
        [2.3000]])
torch.Size([2, 1])

Int:
a = a.unsqueeze(0)
a.shape

Out:
torch.Size([1, 2, 1])

Int:
a.squeeze().shape

Out:
torch.Size([2])

你可能会对维度的增减感到困惑,unsqueeze方法其实是提供索引参数来增加tensor维度的,请看下图:

图中很明显可以看出这两种方法是通过索引来实现的,其中-1代表添加一个维度在最后一个维度之后,0参数则代表添加一个维度在第一个维度之前!
另外如果函数squeeze括号内不给任何参数的话,函数会把所有能删减的维度都减掉

Expand和Repeat函数

通过expand函数对原本矩阵维度进行了扩张,利于其进行矩阵间的运算,repeat函数与repeat函数用法一致!下面看代码实例:

Expand函数:

Int:
import torch
a = torch.rand(4,32,14,14) #创建一个矩阵a与b相加
b = torch.rand(32) #通过unsqueeze函数将b的维度改变成四维tensor
b = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)
b.shape

Out:
torch.Size([1, 32, 1, 1])

Int:
b.expand(4,32,14,14).shape  #通过expand函数将b的维度改变
print(b.shape)

Out:
torch.Size([4, 32, 14, 14])
torch.Size([1, 32, 1, 1]) #使用expand函数 b 自身不会改变,需要将其结果重新赋值

Int:
b.expand(-1,32,-1,-1).shape  #expand函数中参数为-1的地方不改变其维度

Out:
torch.Size([1, 32, 1, 1])

Repeat函数:

Int:
b = torch.rand(1,32,1,1)
b.shape

Out:
torch.Size([1, 32, 1, 1])

Int:
b.repeat(4,1,4,4).shape #repeat函数每个参数的值代表复制的次数
                        #不建议使用repeat函数因为会改变存储器的值
                        
Out:
torch.Size([4, 32, 4, 4])

Transpose和permute函数

这两个函数的用法不同,但目的都是相同的那就是交换任意两个维度的值,具体代码如下:
Transpose函数

Int:
import torch
a = torch.rand(2,3) #一个二维的数组也就是tensor
print(a)

Out:
tensor([[0.9504, 0.3183, 0.4444],
        [0.1419, 0.1671, 0.6415]])

Int:
a.transpose(0,1) #通过transpose函数将tensor的行列关系改变了
print(a)  #transpose函数不改变其本身的值需要重新赋值

Out:
tensor([[0.9504, 0.1419],
        [0.3183, 0.1671],
        [0.4444, 0.6415]])
        
tensor([[0.9504, 0.3183, 0.4444],
        [0.1419, 0.1671, 0.6415]])        

上面transpose函数的参数 0 代表第一个维度,1 代表第二个维度

Permute函数
假设创建一个四维数组索引关系如下:
在这里插入图片描述

Int:
import torch
a = torch.rand(2,3,2,3) 
a.permute(1,0,3,2).shape #通过索引将将维度进行了调换
                    #与transpose不同的是permute可以一次调换多个维度
Out:
torch.Size([3, 2, 3, 2])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值