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)