Python 为什么tf.matmul(a,b,transpose_b=True)有效,而tf.matmul(a,tf.transpose(b))无效?

Python 为什么tf.matmul(a,b,transpose_b=True)有效,而tf.matmul(a,tf.transpose(b))无效?,python,tensorflow,deep-learning,linear-algebra,matrix-multiplication,Python,Tensorflow,Deep Learning,Linear Algebra,Matrix Multiplication,代码: 我想知道y在tf.matmul(x,y,transpose_b=True)中变成了什么形状,这样我就可以专注地了解LSTM中到底发生了什么 对于秩>2的张量,转置可以有不同的定义,这里的区别在于由tf.Transpose和tf.matmul(…,Transpose\u b=True)转置的轴 默认情况下,是否执行以下操作: 返回的张量维度i将对应于输入维度perm[i]。如果未给出perm,则将其设置为(n-1…0),其中n是输入张量的秩。因此,默认情况下,此操作对二维输入张量执行常规矩

代码:


我想知道
y
tf.matmul(x,y,transpose_b=True)
中变成了什么形状,这样我就可以专注地了解LSTM中到底发生了什么

对于秩>2的张量,转置可以有不同的定义,这里的区别在于由
tf.Transpose
tf.matmul(…,Transpose\u b=True)
转置的轴

默认情况下,是否执行以下操作:

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

因此,在您的例子中,它将把
y
转换为形状的张量
(4,21,3)
,它与
x
(见下文)不兼容

但如果设置
perm=[0,2,1]
,则结果是兼容的:


关于
tf.matmul
您可以计算点积:
(a,b,c)*(a,c,d)->(a,b,d)
。但它不是张量点积——它是一个批处理操作(请参阅)

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

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

# Works! (3, 2, 4) * (3, 4, 21) -> (3, 2, 21).
tf.matmul(x, tf.transpose(y, [0, 2, 1]))
# Works! (3, 2, 4) * (3, 4, 21) -> (3, 2, 21).
tf.matmul(x, tf.transpose(y, [0, 2, 1]))
(a, b, c, d) * (a, b, d, e) -> (a, b, c, e)