为什么tf.matmul(a,b,transpose_b = True)有效,但不是tf.matmul(a,tf.transpose(b))?

时间:2018-01-04 17:55:25

标签: python tensorflow deep-learning linear-algebra matrix-multiplication

代码:

x = tf.constant([1.,2.,3.], shape = (3,2,4))
y = tf.constant([1.,2.,3.], shape = (3,21,4))
tf.matmul(x,y)                     # Doesn't work. 
tf.matmul(x,y,transpose_b = True)  # This works. Shape is (3,2,21)
tf.matmul(x,tf.transpose(y))       # Doesn't work.

我想知道y内部tf.matmul(x,y,transpose_b = True)的形状是什么,所以我可以注意LSTM内部的实际情况。

1 个答案:

答案 0 :(得分:1)

对于等级>的张量,可以不同地定义转置。 2,这里的差异在于由tf.matmul(..., transpose_b=True)i转置的轴。

默认情况下,tf.transpose执行此操作:

  

返回的张量维perm[i]将对应于输入维(n-1...0)。如果没有给出perm,则将其设置为y,其中n是输入张量的等级。因此,默认情况下,此操作在二维输入张量上执行常规矩阵转置。

因此,在您的情况下,它会将(4, 21, 3)转换为形状x,其中perm=[0, 2, 1]不兼容(见下文)。

但如果您设置# Works! (3, 2, 4) * (3, 4, 21) -> (3, 2, 21). tf.matmul(x, tf.transpose(y, [0, 2, 1])) ,则结果兼容

tf.matmul

关于(a, b, c) * (a, c, d) -> (a, b, d)

您可以计算点积:a。但它不是张量点产品 - 它是批量操作(参见this question)。

在这种情况下,tf.matmul被视为批量大小,因此a计算矩阵(b, c) * (c, d)的{​​{1}}点积。

批次可以是多个维度,因此这也是有效的:

(a, b, c, d) * (a, b, d, e) -> (a, b, c, e)