tf.multiply vs tf.matmul计算点积

Abr*_*rar 10 python tensorflow

我有一个矩阵(矢量)X形状[3,4],我想计算每对矢量(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]))
Run Code Online (Sandbox Code Playgroud)

输出是:

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

multiplyResult
 [array([  46.,  149.,   67.], dtype=float32)]
Run Code Online (Sandbox Code Playgroud)

我很感激任何建议

pat*_*_ai 25

tf.multiply(X, Y)逐元素相乘,使

[[1 2]    [[1 3]      [[1 6]
 [3 4]] .  [2 1]]  =   [6 4]]
Run Code Online (Sandbox Code Playgroud)

wheras tf.matmul矩阵乘法,使

[[1 0]    [[1 3]      [[1 3]
 [0 1]] .  [2 1]]  =   [2 1]]
Run Code Online (Sandbox Code Playgroud)

使用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]
Run Code Online (Sandbox Code Playgroud)

这意味着:

tf.reduce_sum(tf.multiply(X, X), axis=1) = [X[1].X[1], ..., X[n].X[n]]
Run Code Online (Sandbox Code Playgroud)

如果您只想要每行的规范,那么这就是您想要的那个.另一方面

 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]]
Run Code Online (Sandbox Code Playgroud)

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

  • 作为旁注,`tf.multiply(a,b)`与`a*b`相同 (3认同)

Ben*_*man 5

是什么tf.multiply(X, X)呢矩阵的每个元素基本上是乘以本身,像

[[1 2]
 [3 4]]
Run Code Online (Sandbox Code Playgroud)

会变成

[[1 4]
 [9 16]]
Run Code Online (Sandbox Code Playgroud)

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

[5 25]
Run Code Online (Sandbox Code Playgroud)

这完全(根据定义)等于[X[0, :] @ X[0, :], X[1, :] @ X[1, :]]

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