簡體   English   中英

tf.multiply vs tf.matmul計算點積

[英]tf.multiply vs tf.matmul to calculate the dot product

我有一個矩陣(矢量)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]))

輸出是:

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

multiplyResult
 [array([  46.,  149.,   67.], dtype=float32)]

我很感激任何建議

tf.multiply(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 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]]

如果你想要所有行對之間的相似性,那么這就是你所需要的。

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, :]]

只需用變量名[[ab] [cd]]而不是實際數字來記下它,看看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)[通常的數學]。

一旦理解,這可以很容易地應用於多維矩陣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM