使用Tensorflow执行matmul时出现值错误

使用Tensorflow执行matmul时出现值错误,tensorflow,Tensorflow,我完全是TensorFlow的初学者,我试图将两个矩阵相乘,但我不断遇到一个例外,即: ValueError:形状TensorShape([Dimension(2)]和TensorShape([Dimension(None),Dimension(None)]必须具有相同的等级 下面是最简单的示例代码: data=np.array([0.1,0.2]) x=tf.placeholder(“float”,shape=[2]) T1=tf.Variable(tf.ones([2,2])) l1=tf

我完全是TensorFlow的初学者,我试图将两个矩阵相乘,但我不断遇到一个例外,即:

ValueError:形状TensorShape([Dimension(2)]和TensorShape([Dimension(None),Dimension(None)]必须具有相同的等级
下面是最简单的示例代码:

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)
初始化所有变量()
使用tf.Session()作为sess:
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]))
初始化所有变量()
使用tf.Session()作为sess:
sess.run(初始化)
run(T1*x,feed_dict={x:data}
有人能指出问题所在吗?我这里肯定遗漏了一些明显的东西。

op要求它的两个输入都是矩阵(即二维张量)*,并且不执行任何自动转换。你的
T1
变量是矩阵,但你的
x
占位符是长度为2的向量(即一维张量),这是错误的来源

相比之下,
*
运算符(的别名)是一种广播元素乘法。它将通过以下方式将向量参数转换为矩阵

要使矩阵乘法工作,您可以要求
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})
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:
    # ...
…或者您可以使用op将向量转换为矩阵:

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})
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()
还支持批处理矩阵乘法。这要求两个参数至少具有2维。有关更多详细信息,请参阅。

谢谢,太好了!错误消息非常隐晦。这是一个很好的观点!我将在下一个版本中发送修补程序对其进行改进。谢谢-那么可以将向量与矩阵相乘以获得向量吗(不是矩阵)?或者我必须遵循这个答案然后重塑?现在tf.multiplyGood变成了tf.multiplyGood建议。但是你缺少sess.run(l1,feed_dict={x:data})}。虽然这是一件小事,但对于初学者来说可能是有帮助的。