版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/david0611/article/details/81058197

pytorch中提供了对tensor常用的变换操作。

cat 连接

对数据沿着某一维度进行拼接。cat后数据的总维数不变。
比如下面代码对两个2维tensor(分别为2*3,1*3)进行拼接,拼接完后变为3*3还是2维的tensor。
代码如下:

import torch
torch.manual_seed(1)
x = torch.randn(2,3)
y = torch.randn(1,3)
print(x,y)

  
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

0.6614  0.2669  0.0617
 0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]
-1.5228  0.3817 -1.0276
[torch.FloatTensor of size 1x3]

  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

将两个tensor拼在一起:

torch.cat((x,y),0)

  
  • 1

结果:

 0.6614  0.2669  0.0617
 0.6213 -0.4519 -0.1661
-1.5228  0.3817 -1.0276
[torch.FloatTensor of size 3x3]

  
  • 1
  • 2
  • 3
  • 4

更灵活的拼法:

torch.manual_seed(1)
x = torch.randn(2,3)
print(x)
print(torch.cat((x,x),0))
print(torch.cat((x,x),1))

  
  • 1
  • 2
  • 3
  • 4
  • 5

结果

// x
0.6614  0.2669  0.0617
 0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]
// torch.cat((x,x),0)
 0.6614  0.2669  0.0617
 0.6213 -0.4519 -0.1661
 0.6614  0.2669  0.0617
 0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 4x3]
// torch.cat((x,x),1)
 0.6614  0.2669  0.0617  0.6614  0.2669  0.0617
 0.6213 -0.4519 -0.1661  0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x6]

  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

stack,增加新的维度进行堆叠

而stack则会增加新的维度。
如对两个1*2维的tensor在第0个维度上stack,则会变为2*1*2的tensor;在第1个维度上stack,则会变为1*2*2的tensor。
见代码:

a = torch.ones([1,2])
b = torch.ones([1,2])
c= torch.stack([a,b],0) // 第0个维度stack

  
  • 1
  • 2
  • 3

输出:

(0 ,.,.) = 
  1  1
(1 ,.,.) = 
  1  1
[torch.FloatTensor of size 2x1x2]

  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
c= torch.stack([a,b],1) // 第1个维度stack

  
  • 1

输出:

(0 ,.,.) = 
  1  1
  1  1
[torch.FloatTensor of size 1x2x2]

  
  • 1
  • 2
  • 3
  • 4

transpose ,两个维度互换

代码如下:

torch.manual_seed(1)
x = torch.randn(2,3)
print(x)

  
  • 1
  • 2
  • 3

原来x的结果:

 0.6614  0.2669  0.0617
 0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]

  
  • 1
  • 2
  • 3

将x的维度互换

x.transpose(0,1)

  
  • 1

结果

0.6614  0.6213
 0.2669 -0.4519
 0.0617 -0.1661
[torch.FloatTensor of size 3x2]

  
  • 1
  • 2
  • 3
  • 4

permute,多个维度互换,更灵活的transpose

permute是更灵活的transpose,可以灵活的对原数据的维度进行调换,而数据本身不变。
代码如下:

x = torch.randn(2,3,4)
print(x.size())
x_p = x.permute(1,0,2) # 将原来第1维变为0维,同理,0→1,2→2
print(x_p.size())

  
  • 1
  • 2
  • 3
  • 4

结果:

torch.Size([2, 3, 4])
torch.Size([3, 2, 4])

  
  • 1
  • 2

squeeze 和 unsqueeze

常用来增加或减少维度,如没有batch维度时,增加batch维度为1。

  • squeeze(dim_n)压缩,减少dim_n维度 ,即去掉元素数量为1的dim_n维度。
  • unsqueeze(dim_n),增加dim_n维度,元素数量为1。

上代码:

# 定义张量
import torch
b = torch.Tensor(2,1)
b.shape
Out[28]: torch.Size([2, 1])
#不加参数,去掉所有为元素个数为1的维度
b_ = b.squeeze()
b_.shape
Out[30]: torch.Size([2])
#加上参数,去掉第一维的元素为1,不起作用,因为第一维有2个元素
b_ = b.squeeze(0)
b_.shape 
Out[32]: torch.Size([2, 1])
#这样就可以了
b_ = b.squeeze(1)
b_.shape
Out[34]: torch.Size([2])
#增加一个维度
b_ = b.unsqueeze(2)
b_.shape
Out[36]: torch.Size([2, 1, 1])

  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26