矩阵乘法张量流与numpy的差异

时间:2017-02-12 21:40:57

标签: python numpy matrix tensorflow

我的情况是两个具有一定维度的矩阵的矩阵乘法在numpy中工作,但在张量流中不起作用。

x = np.ndarray(shape=(10,20,30), dtype = float)
y = np.ndarray(shape=(30,40), dtype = float)
z = np.matmul(x,y)
print("np shapes: %s x %s = %s" % (np.shape(x), np.shape(y), np.shape(z)))

这可以按预期工作并打印:

np shapes: (10, 20, 30) x (30, 40) = (10, 20, 40)

然而,在tensorflow中,当我尝试将占位符和与上面的numpy数组相同形状的变量相乘时,我得到一个错误

x = tf.placeholder(tf.float32, shape=(10,20,30))
y = tf.Variable(tf.truncated_normal([30,40], name='w'))
print("tf shapes: %s x %s" % (x.get_shape(), y.get_shape()))
tf.matmul(x,y)

结果

tf shapes: (10, 20, 30) x (30, 40)
InvalidArgumentError: 
Shape must be rank 2 but is rank 3 for 'MatMul_12' 
(op: 'MatMul') with input shapes: [10,20,30], [30,40].

为什么这个操作会失败?

3 个答案:

答案 0 :(得分:2)

不知道为什么tf.matmul不支持这种乘法(可能是核心开发人员之一可以提供有意义的答案)。

但是如果您只是希望能够以这种方式倍增张量,请查看tf.einsum函数。它可以与任意等级的张量一起运作。

答案 1 :(得分:0)

正如Dmytro所建议的tf.einsum可用于将这两个数组相乘。

x = np.ndarray(shape=(10,20,30), dtype = float)
y = np.ndarray(shape=(30,40), dtype = float)

这两个操作产生完全相同的结果:

np.einsum('ijk,kl->ijl', x, y)
np.matmul(x,y)

相应的张量流操作也有效

tf.einsum('ijk,kl->ijl', tf_x,tf_y)

答案 2 :(得分:0)

人们已经告诉过你,你可以使用tf.einsum() 来获得你想要的结果。

import tensorflow as tf
x = tf.random_normal([10, 20, 30])
y = tf.random_normal([30, 40])
z = tf.einsum('ijk,kl->ijl', x, y)

tf.matmul()无法按预期方式工作的原因写在文档中。

  

输入必须是矩阵(或等级> 2的张量,代表   批次的矩阵,具有匹配的内部尺寸,可能在之后   转置。

在您的情况下,您有一个矩阵y和一个张量x(等级3> 2)。在您的情况下,内部尺寸不匹配。如果你想要,他们匹配,你需要有这样的东西:

import tensorflow as tf
a, b, c = 12, 50, 20
x = tf.random_normal([a, b, c])
y = tf.random_normal([a, c, b])
z = tf.matmul(x, y)

但显然它不会计算你想要的东西。