K.dot(A,B)
A.shape(-1)和B.shape(-2)必须一样,其余没有限制
K.batch_dot(A,B)
A.shape(-1)和B.shape(-2)必须一样,A.shape(-2)和B.shape(-1)可以不一样,shape(-2)以前的必须完全一样
具体这两个怎么计算呢
假设:
a.shape:(1, 2, 4) b.shape:(8, 7, 4, 5)
c=K.dot(a,b) c.shape:(1,2,8,7,5)
如果要计算
C
i
,
j
,
k
,
m
,
n
C_{i,j,k,m,n}
Ci,j,k,m,n则先取出A[i]这个矩阵,再取出B[k][m]这个矩阵,两个相乘,得到一个矩阵D(矩阵的维度是 2×5,为什么是2×5矩阵,因为一个2×4的矩阵和一个4×5的矩阵相乘) 则
C
i
,
j
,
k
,
m
,
n
C_{i,j,k,m,n}
Ci,j,k,m,n=
D
j
,
n
D_{j,n}
Dj,n
另一例:
a = K.ones((9, 8, 7, 4, 2))
b = K.ones((9, 8, 7, 2, 5))
c = K.batch_dot(a, b)
c.shape (9, 8, 7, 4, 5)
如果要计算
C
i
,
j
,
k
,
m
,
n
C_{i,j,k,m,n}
Ci,j,k,m,n则先取出A[i][j][k]这个矩阵,再取出B[i][j][k]这个矩阵,两个相乘,得到一个矩阵D(矩阵的维度是 4×5) 则
C
i
,
j
,
k
,
m
,
n
C_{i,j,k,m,n}
Ci,j,k,m,n=
D
m
,
n
D_{m,n}
Dm,n
总结要点:
取出两个矩阵(矩阵显然是二维的),相乘,然后将这个矩阵对应的放到该放的位置上
具体参考:https://christopher5106.github.io/deep/learning/2018/10/28/understand-batch-matrix-multiplication.html
(这篇讲的很好)
python中np.multiply()、np.dot()和星号()三种乘法运算的区别:
https://www.cnblogs.com/hezhiyao/p/8649231.html
(numpy矩阵用*就默认是矩阵相乘,但是array相乘不能这么用,得用方法.dot())
TensorFlow - tf.multiply和tf.matmul 区别:
https://blog.csdn.net/flyfish1986/article/details/79141763/
注意tf.multiply(a,b)应该是只允许a、b最后一维可以不同,但是此时必须有一个维度是1,ab就相当于tf.multiply(a,b)
tf.matmul只可以a的倒数第一维和b的倒数第二维不一样,别的都必须一样(当len(shape(a或b))>2,表示成批的矩阵)
K.dot和K.batch_dot
最新推荐文章于 2022-05-30 13:19:24 发布