使用Tensorflow执行matmul时的ValueError

hom*_*lad 17 tensorflow

我是TensorFlow的初学者,我正在尝试将两个矩阵相乘,但我不断得到一个例外:

ValueError: Shapes TensorShape([Dimension(2)]) and TensorShape([Dimension(None), Dimension(None)]) must have the same rank
Run Code Online (Sandbox Code Playgroud)

这是最小的示例代码:

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}
Run Code Online (Sandbox Code Playgroud)

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

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}
Run Code Online (Sandbox Code Playgroud)

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

mrr*_*rry 19

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

相比之下,*运算符(别名tf.multiply())是广播元素乘法.它将通过遵循NumPy广播规则将vector参数转换为矩阵.

要使矩阵乘法工作,您可以要求它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})
Run Code Online (Sandbox Code Playgroud)

...或者您可以使用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:
    # ...
Run Code Online (Sandbox Code Playgroud)

*当我首先发布答案时,这是真的,但现在tf.matmul()也支持批量矩阵乘法.这要求两个参数至少具有 2个维度.有关详细信息,请参阅文档.

  • 谢谢 - 所以可以将向量与矩阵相乘以得到向量(而不是矩阵)吗?或者我必须按照这个答案然后重塑? (2认同)