1 . 通过 tensor.view 方法可以调整 tensor 的形状,但必须保证调整前后元素总数一致,返回的新 tensor 与源 tensor 共享内存,即更改其中一个,另一个也会跟着改变。

1
2
3
4
5
6
a = t.arange(0, 6)
print(a.view(2, 3))

# 当某一维为 -1 时,会自动计算它的大小
b = a.view(-1, 3)
print(b.shape)

2 . 在实际应用中可能需要添加或减少某一维度,这时 squeezeunsqueeze 两个函数就派上用场了。

Input:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import torch as t

a = t.arange(0, 6)
b = a.view(-1, 3)

print(b)
print(b.shape)

print(b.unsqueeze(1)) # 在第 1 维(下标从 0 开始)上增加 "1"
# 等价于 b[:,None]
print(b[:, None].shape)

print(b.unsqueeze(-2)) # -2 表示倒数第二个维度

c = b.view(1, 1, 1, 2, 3)
print(c)
print(c.squeeze(0)) # 压缩第 0 维的 "1"

print(c.squeeze()) # 把所有维度为 "1" 的都压缩掉

a[1] = 100
print(b) # b 作为 view 之后的也跟着被修改

Output:

3 . resize 是另一种可用来调整 size 的方法,但是与 view 不同,它可以修改 tensor 的大小,如果新大小超过了原大小,会自动分配新的存储空间,而如果新大小小于原大小,则之前的数据依旧会被保存。

Input:

1
2
3
4
5
6
7
8
9
import torch as t

b = t.arange(0, 6)

b.resize_(1, 3)
print(b)

b.resize_(3, 3)
print(b)

Output:


笔记来源:《pytorch-book》