使用 Tensorflow 执行 matmul 时出现 ValueError
ValueError when performing matmul with Tensorflow
我完全是 TensorFlow 的初学者,我正在尝试将两个矩阵相乘,但我不断收到一个异常:
ValueError: Shapes TensorShape([Dimension(2)]) and TensorShape([Dimension(None), Dimension(None)]) must have the same rank
这是最简单的示例代码:
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}
谁能指出问题所在?我一定是遗漏了一些明显的东西..
tf.matmul()
op 要求它的两个输入都是矩阵(即二维张量)*,并且不执行任何自动转换。您的 T1
变量是一个矩阵,但您的 x
占位符是长度为 2 的向量(即一维张量),这是错误的来源。
相比之下,*
运算符(tf.multiply()
) is a broadcasting element-wise multiplication. It will convert the vector argument to a matrix by following 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()
操作将向量转换为矩阵:
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 个维度。有关详细信息,请参阅 the documentation。
我完全是 TensorFlow 的初学者,我正在尝试将两个矩阵相乘,但我不断收到一个异常:
ValueError: Shapes TensorShape([Dimension(2)]) and TensorShape([Dimension(None), Dimension(None)]) must have the same rank
这是最简单的示例代码:
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}
谁能指出问题所在?我一定是遗漏了一些明显的东西..
tf.matmul()
op 要求它的两个输入都是矩阵(即二维张量)*,并且不执行任何自动转换。您的 T1
变量是一个矩阵,但您的 x
占位符是长度为 2 的向量(即一维张量),这是错误的来源。
相比之下,*
运算符(tf.multiply()
) is a broadcasting element-wise multiplication. It will convert the vector argument to a matrix by following 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()
操作将向量转换为矩阵:
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 个维度。有关详细信息,请参阅 the documentation。