2016-01-20 84 views
14

我是一个总的初学者TensorFlow,和我试图将两个矩阵相乘在一起,但我不断收到写着一个例外:Tensorflow例外与MATMUL

ValueError异常:形状TensorShape([尺寸(2) ])和TensorShape([尺寸(无),外形尺寸(无)])必须具有相同的等级

下面是最小的示例代码:

data = np.array([0.1, 0.2]) 
x = tf.placeholder("float", shape=[2]) 
T1 = tf.Variable(tf.ones([2,2])) 
l1 = tf.matmul(T1, x) 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    sess.run(feed_dict={x: data} 

令人困惑的是,下面的非常相似的代码工作正常:

data = np.array([0.1, 0.2]) 
x = tf.placeholder("float", shape=[2]) 
T1 = tf.Variable(tf.ones([2,2])) 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    sess.run(T1*x, feed_dict={x: data} 

任何人都可以指出是什么问题?我必须缺少明显的东西在这里..

回答

15

tf.matmul()运算要求两个其输入是矩阵(即,2-d张量)*,并且不执行任何自动转换。您的T1变量是一个矩阵,但是您的x占位符是一个长度为2的向量(即一维张量),它是错误的来源。

相比之下,*运算符(tf.multiply()的别名)是一种广播单元乘法。它将通过跟随NumPy broadcasting rules将矢量参数转换为矩阵。

为了使您的矩阵乘法的工作,你可以要求x是一个矩阵:

data = np.array([[0.1], [0.2]]) 
x = tf.placeholder(tf.float32, shape=[2, 1]) 
T1 = tf.Variable(tf.ones([2, 2])) 
l1 = tf.matmul(T1, x) 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    sess.run(l1, feed_dict={x: data}) 

...或者你可以使用tf.expand_dims() op将向量转换为一个矩阵:

data = np.array([0.1, 0.2]) 
x = tf.placeholder(tf.float32, shape=[2]) 
T1 = tf.Variable(tf.ones([2, 2])) 
l1 = tf.matmul(T1, tf.expand_dims(x, 1)) 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    # ... 

*这是真的,当我第一次发布答案,但现在tf.matmul()也支持批量矩阵乘法。这需要两个参数都至少具有两个维度。有关更多详细信息,请参阅the documentation

+0

谢谢,完美!那个错误信息很神秘。 – homesalad

+1

这是一个好点!我会在下一个版本中发布补丁以改进它。 – mrry

+2

谢谢 - 所以有可能乘以一个矩阵矢量来获得一个矢量(而不是一个矩阵)?或者我必须遵循这个答案,然后重塑? –