【问题标题】:tensorflow matrix multiplication张量流矩阵乘法
【发布时间】:2018-05-24 04:05:56
【问题描述】:

所以,我想将矩阵与矩阵相乘。当我尝试使用矩阵的数组时,它可以工作:

import tensorflow as tf

x = tf.placeholder(tf.float32, [None, 3])
W = tf.Variable(tf.ones([3, 3]))
y = tf.matmul(x, W)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    curr_y = sess.run(y, feed_dict={x: [[1,2,3],[0,4,5]]})
    print curr_y

所以数组的批量大小为 2,形状为 3x1。所以我可以将形状为 3x3 的矩阵与数组 3x1 相乘。 但是当我再次有一个形状为 3x3 的矩阵时,但这次是一个矩阵而不是一个形状为 3x2、批量大小为 2 的数组,它不起作用。

但是,如果我尝试将矩阵与矩阵相乘。它不起作用。

import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 3,3])
W = tf.Variable(tf.ones([3, 3]))
y = tf.matmul(x, W)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    curr_y = sess.run(y, feed_dict={x: [[[1,2,3],[1,2,3]],[[1,1,4],[0,4,5]]]})
    print curr_y

ValueError: Shape 必须是 2 级,但 'MatMul' 是 3 级(操作: 'MatMul') 输入形状:[?,3,3], [3,3]。

########编辑

对不起,我想要做的是,将一个矩阵与一批矩阵或数组进行 m​​atmul。所以我不想做

y = tf.matmul(x, W)

其实我也想做

y = tf.matmul(W, x)

【问题讨论】:

    标签: python matrix tensorflow


    【解决方案1】:

    您对张量“x”的输入具有形状 (2, 2, 3)。 您正在尝试对 (2, 2, 3) 和 (3, 3) 进行矩阵乘法。他们没有相同的排名,这就是错误的原因。

    来自 TensorFlow 官方网站: https://www.tensorflow.org/api_docs/python/tf/matmul

    Args:
    
    a: Tensor of type float16, float32, float64, int32, complex64, complex128 and rank > 1.
    b: Tensor with same type and rank as a.
    

    【讨论】:

      【解决方案2】:

      当你做矩阵乘法时,矩阵的shape需要follow the rule (a, b) * (b, c) = (a, c)

      请记住,您定义的 W 的形状是 (3, 3)。

      这个feed_dict={x: [[1,2,3],[0,4,5]]}是一个二维数组,它的形状是(2, 3)

      In [67]: x = [[1, 2, 3], [0, 4, 5]]
      
      In [68]: x = np.array(x)
      
      In [69]: x.shape
      Out[69]: (2, 3)
      

      遵循规则(2, 3) * (3, 3) => (2, 3)

      但是你的第二个例子,形状不遵循乘法规则。您输入的形状是 (2, 2, 3),它甚至与您定义的 W 的维度不同,所以它不起作用。

      In [70]: foo = [[[1,2,3],[1,2,3]],[[1,1,4],[0,4,5]]]
      
      In [71]: foo = np.array(foo)
      
      In [72]: foo.shape
      Out[72]: (2, 2, 3)
      

      【讨论】:

      • 所以数组的批量大小为 2,形状为 3x1。所以我可以将形状为 3x3 的矩阵与数组 3x1 相乘。但是当我再次有一个形状为 3x3 的矩阵时,但这次是一个矩阵而不是一个形状为 3x2 的数组,批量大小为 2,它不起作用。我明白了,你写的。但是我怎样才能将一个矩阵与另一个矩阵相乘。批量大小为 X。我认为,我有一个错误。我想做 y = tf.matmul(W,x) 而不是 y = tf.matmul(x,W) 但是它对这两个例子都不起作用。那么,如何将一个矩阵乘以一批数组呢?
      • @tag 我不完全明白你的意思,当你说multiply a matrix to a batch 时,你的意思是尝试一直乘到最后一个并得到结果吗? matmul 不会为你这样做,可能使用 for 循环是你需要做的..
      猜你喜欢
      • 2023-03-20
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 2019-10-29
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多