理解多维矩阵运算
深度学习时会遇到元素相乘的情况:比如在深度学习中的注意力机制计算过程中计算加权和,于是查阅相关资料,以便理解数据的变换和相互运算。
1.高维矩阵可视化
看维度的小技巧:想知道一个矩阵的维度是几维的,只需要看开头有几个“[”,有1个即为1维,上面的两个就是两维,后面举到的三维和四维的例子,分别是有三个“[”、四个“[”的。
-
**一维:**一维的矩阵非常简单,比如[1,2,3],可以用下图表示
-
**二维:**可以用以下代码生成一个二维矩阵,采用Keras框架
import keras.backend as K import numpy as np a = K.constant(np.arange(1, 7), shape=[2,3]) print(K.eval(a))
输出为:
[[1. 2. 3.] [4. 5. 6.]]
上面这两维可视化长这样:
为了方便后续解释三维和四维,我们把它旋转一个小角度,如下:
-
**三维:**同样可用以下代码生成一个三维矩阵:
a = K.constant(np.arange(1, 13), shape=[2,2,3]) print(K.eval(a))
输出为:
[[[ 1. 2. 3.] [ 4. 5. 6.]] [[ 7. 8. 9.] [10. 11. 12.]]]
结论:shape=[2,2,3]的三维矩阵,可以视为2个shape=[2,3]的二维矩阵堆叠在一起!!最后两维才是有数据的矩阵,前面的维度只是矩阵的排列而已!
- **四维:**堆叠的三维
结论:shape=[2,2,2,3]的四维矩阵,可以视为2个shape=[2,2,3]的三维矩阵堆叠在一起!!然后三维的最后是用二维的堆叠组成的!!第一个2表示的是batchsize!!最后两维才是有数据的矩阵,前面的维度只是矩阵的排列而已!
2.高维矩阵运算
矩阵运算的时候,其实最后都可以转成我们常见的二维矩阵运算,遵循的原则是:在多维矩阵相乘中,需最后两维满足shape匹配原则,最后两维才是有数据的矩阵,前面的维度只是矩阵的排列而已!
比如两个三维的矩阵相乘,分别为shape=[2,2,3]和shape=[2,3,2]
a =
[[[ 1. 2. 3.]
[ 4. 5. 6.]]
[[ 7. 8. 9.]
[10. 11. 12.]]]
b =
[[[ 1. 2.]
[ 3. 4.]
[ 5. 6.]]
[[ 7. 8.]
[ 9. 10.]
[11. 12.]]]
计算的时候把a的第一个shape=[2,3]的矩阵和b的第一个shape=[3,2]的矩阵相乘,得到的shape=[2,2],即
同理,再把a,b个字的第二个shape = [2,3]的矩阵相乘
最终把结果堆叠在一起,就是2个shape=[2,2]的矩阵堆叠在一起,结果为:
[[[ 22. 28.]
[ 49. 64.]]
[[220. 244.]
[301. 334.]]]
也就是shape=[2,2,3]和shape=[2,3,2]矩阵相乘,最后答案的shape为:把第一维表示矩阵排情况的2,直接保留作为结果的第一维,再把后面两维的通过矩阵运算,得到shape=[2,2]的矩阵,合起来结果shape=[2,2,2]
需要注意的是,四维中,前两维是矩阵排列,相乘的话保留前的最大值。–两个n维数组的前n-2维一般要相同,除了一维的情况.
比如a:shape=[2,1,4,5],b:shape=[1,1,5,4]相乘,输出的结果中,前两维保留的是[2,1],最终结果shape=[2,1,4,4]