【问题标题】:ValueError when performing matmul with Tensorflow使用 Tensorflow 执行 matmul 时出现 ValueError
【发布时间】:2016-01-20 18:46:30
【问题描述】:

我是 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}

谁能指出问题所在?我必须在这里遗漏一些明显的东西..

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    tf.matmul() 操作要求其两个输入都是矩阵(即二维张量)*,并且不执行任何自动转换。您的 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() 操作将向量转换为矩阵:

    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

    【讨论】:

    • 谢谢,完美!该错误消息非常神秘。
    • 说得好!我会在下一个版本中发送一个补丁来改进它。
    • 谢谢 - 那么是否可以将向量与矩阵相乘以获得向量(不是矩阵)?还是我必须遵循这个答案然后重塑?
    • 现在 tf.mul 变成了 tf.multiply
    • 好建议。但是您缺少sess.run(l1, feed_dict={x: data}) }。虽然是小事,但是对于初学者的水平可能会有帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 2020-05-08
    • 2021-02-22
    • 2021-05-08
    • 2022-10-14
    • 2017-05-09
    • 2018-07-25
    • 2015-01-30
    相关资源
    最近更新 更多