tf.multiply vs tf.matmul计算点积

时间:2017-11-30 22:12:00

标签: python tensorflow

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

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

tf.reduce_sum(tf.multyply(X,X),axis = 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)]

我很感激任何建议

3 个答案:

答案 0 :(得分:19)

tf.multiply(X, Y)执行元素乘法以便

[[1 2]    [[1 3]      [[1 6]
 [3 4]] .  [2 1]]  =   [6 4]]

whe 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_sum(_, 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]]

如果您想要所有行对之间的相似性,那么这就是您所需要的。

答案 1 :(得分:3)

tf.multiply(X, X)所做的基本上是将矩阵的每个元素与自身相乘,例如

[[1 2]
 [3 4]]

会变成

[[1 4]
 [9 16]]

tf.reduce_sum(_, axis=1)取每行的总和,因此前一个示例的结果将是

[5 25]

正好(按定义)等于[X[0, :] @ X[0, :], X[1, :] @ X[1, :]]

只需使用变量名称[[a b] [c d]]而不是实际数字,然后查看tf.matmul(X, X)tf.multiply(X, X)做了什么。

答案 2 :(得分:1)

简而言之, tf.multiply()是元素明智的产品(点积)。 而 tf.matmul()进行实际的矩阵多重表达。 所以 tf.multiply()需要相同形状的参数,以便元素明智的产品是可能的,即形状是(n,m)和(n,m)。但是 tf.matmul()需要形状(n,m)和(m,p)的参数,以便得到的矩阵是(n,p)[通常的数学]。

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