张量的reshape与matmul操作

Intro

对张量进行reshape操作, 数据是怎样重新组织的.

对张量进行matmul操作, 对于高维张量是怎么计算的.

reshape

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
a = np.arange(16)
b = a.reshape(2, 4, 2)
c = a.reshape(2, 2, 4)
print('a', a)
print('b', b)
print('c', c)

"""
a [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
b [[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]]

[[ 8 9]
[10 11]
[12 13]
[14 15]]]
c [[[ 0 1 2 3]
[ 4 5 6 7]]

[[ 8 9 10 11]
[12 13 14 15]]]
"""

对于所有的元素squeeze到一阶的位置始终是一样的, reshape只是将他们放到张量的不同阶的位置上.

matmul

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
27
28
29
30
31
32
33
34
35
a = np.arange(16)
a = a.reshape(2, 4, 2)
b = a.reshape(2, 2, 4)
c = np.matmul(a, b)
print('a', a)
print('b', b)
print('c', c)

"""
a [[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]]

[[ 8 9]
[10 11]
[12 13]
[14 15]]]

b [[[ 0 1 2 3]
[ 4 5 6 7]]

[[ 8 9 10 11]
[12 13 14 15]]]

c [[[ 4 5 6 7]
[ 12 17 22 27]
[ 20 29 38 47]
[ 28 41 54 67]]

[[172 189 206 223]
[212 233 254 275]
[252 277 302 327]
[292 321 350 379]]]
"""

对于高阶的矩阵乘, 需要他们的总维数是一样的.

对于再高的阶数, 用于计算的只有第-1, -2维.

参与计算后高阶的部分仍保持不变.