张量流矩阵乘法

时间:2017-12-10 13:22:25

标签: python matrix tensorflow

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

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。 (OP:   ' MatMul')输入形状:[?,3,3],[3,3]。

########编辑

抱歉,我想要做的是将矩阵与一批矩阵或数组相匹配。所以我不想做

y = tf.matmul(x, W)
实际上,我想做

y = tf.matmul(W, x)

2 个答案:

答案 0 :(得分:0)

你对张量'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.

答案 1 :(得分:0)

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

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

这个feed_dict={x: [[1,2,3],[0,4,5]]}是一个2D数组,它的形状是(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)