Python tf.multiply vs tf.matmul计算点积

Python tf.multiply vs tf.matmul计算点积,python,tensorflow,Python,Tensorflow,我有一个形状为[3,4]的矩阵X,我想计算每对向量(X[1].X[1])和(X[1].X[2])之间的点积,等等 我看到了他们使用的余弦相似代码 减少总和(多(X,X),轴=1) 计算向量矩阵中向量之间的点积。然而,此结果仅计算(X[i],X[i])之间的点积 我使用了tf.matmul(X,X,transpose_b=True)来计算每两个向量之间的点积,但是我仍然不明白为什么tf.multiply没有这样做,我认为我的代码有问题 代码是: data=[[1.0,2.0,4.0,5.0],[0

我有一个形状为[3,4]的矩阵X,我想计算每对向量(X[1].X[1])和(X[1].X[2])之间的点积,等等

我看到了他们使用的余弦相似代码

减少总和(多(X,X),轴=1)

计算向量矩阵中向量之间的点积。然而,此结果仅计算(X[i],X[i])之间的点积

我使用了tf.matmul(X,X,transpose_b=True)来计算每两个向量之间的点积,但是我仍然不明白为什么tf.multiply没有这样做,我认为我的代码有问题

代码是:

data=[[1.0,2.0,4.0,5.0],[0.0,6.0,7.0,8.0],[8.0,1.0,1.0,1.0]]
X=tf.constant(data)
matResult=tf.matmul(X, X, transpose_b=True)

multiplyResult=tf.reduce_sum(tf.multiply(X,X),axis=1)
with tf.Session() as sess:
   print('matResult')
   print(sess.run([matResult]))
   print()
   print('multiplyResult')
   print(sess.run([multiplyResult]))
输出为:

matResult
[array([[  46.,   80.,   19.],
       [  80.,  149.,   21.],
       [  19.,   21.,   67.]], dtype=float32)]

multiplyResult
 [array([  46.,  149.,   67.], dtype=float32)]
如果您能给我一些建议,我将不胜感激。
tf.multiply(X,X)
实际上是将矩阵的每个元素与自身相乘,如

[[1 2]
 [3 4]]
会变成

[[1 4]
 [9 16]]
tf.reduce\u sum(u,axis=1)
则取每行的和,因此前面示例的结果将为

[5 25]
它(根据定义)正好等于
[X[0,:]@X[0,:],X[1,:]@X[1,:]


只要用变量名而不是实际的数字写下来,看看tf.matmul(X,X)和tf.multiply(X,X)做什么。

简言之tf.multiply()做元素乘积(点积)。 而tf.matmul()执行实际的矩阵交互应用。 因此tf.multiply()需要具有相同形状的参数,以便可以进行元素乘积,即形状为(n,m)和(n,m)。但是tf.matmul()需要形状参数(n,m)和(m,p),这样得到的矩阵是(n,p)[通常的数学]

一旦理解,这可以很容易地应用于多维矩阵。

tf。乘法(X,Y)
进行元素乘法,因此

[[1 2]    [[1 3]      [[1 6]
 [3 4]] .  [2 1]]  =   [6 4]]
tf.matmul
进行矩阵乘法时

[[1 0]    [[1 3]      [[1 3]
 [0 1]] .  [2 1]]  =   [2 1]]
使用
tf.matmul(X,X,transpose_b=True)
意味着您正在计算
X。X^T
其中
^T
表示矩阵的转置,
表示矩阵乘法

tf.reduce\u sum(\uu,axis=1)
沿第一个轴取和(从0开始计数),这意味着您正在对行求和:

tf.reduce_sum([[a b], [c, d]], axis=1) = [a+b, c+d]
这意味着:

tf.reduce_sum(tf.multiply(X, X), axis=1) = [X[1].X[1], ..., X[n].X[n]]
这就是你想要的,如果你只想要每行的范数。另一方面

 tf.matmul(X, X, transpose_b=True) = [[ X[1].X[1], X[1].X[2], ..., X[1].X[n]], 
                                       [X[2].X[1], ..., X[2].X[n]],
                                       ...
                                       [X[n].X[1], ..., X[n].X[n]]

如果你想要所有行对之间的相似性,这就是你需要的

作为旁注,
tf.multiply(a,b)
a*b
相同。