矩阵操作是深度学习中非常基础的操作,pytorch 中的 tensor 和 numpy 中的 array 都提供了大量的矩阵操作方法,其中之一就是 reshape 操作。reshape 操作主要是为了重整矩阵维度,以便于后续的运算。
reshape 实现原理
与 C 语音中的高维数组类似,一个高维矩阵底层事实上还是一维矩阵,例如二维矩阵 [[1,2,3], [4,5,6]],可以看作是对一个一维矩阵 [1,2,3,4,5,6] 分为两个部分[1,2,3] 和 [4,5,6] 之后组合成为的二维。在对矩阵进行 reshape 时,事实上就是对对应的一维矩阵进行重新的维度划分形成高维矩阵的过程。
对于高维矩阵的 reshape 操作,完全可以将其看作一个二维数组的 reshape 过程。只需要记住二维矩阵 reshape 的含义,那么就可以随意理解高维矩阵 reshap 的含义。而对任意二维矩阵 A,最常见的是两种 reshape 操作:
import torch
A = torch.arange(16)
'''
A
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
'''
A1 = A.view(2,8)
'''
A1
tensor([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13, 14, 15]])
'''
A2 = A.view(8,2)
'''
A2
tensor([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11],
[12, 13],
[14, 15]])
'''
上面讲的 reshape 原则,在 numpy 中对应的是 C order,也就是说每次索引时,最后一个轴变化最快(上面例子中,也就是横轴优先遍历)。
对于高维情况则按照如下方式进行理解:
- 维度合并。将高维拉成一维,常用 C order 原则,对一维矩阵进行遍历,对应到原矩阵越后面的维度变化越快;
- 维度变化。假设只对两个维度进行操作,则可以忽略其它不相干维度,完全可以看作二维矩阵的 reshape。