2017-12-10 5 views
-1

行列を行列に乗算したい。行列を使って配列を試すと、次のようになります。テンソルフロー行列乗算

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です。だから私は配列3x1と3x3の形状で行列を掛けることができます。 しかし、私は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 must be rank 2 but is rank 3 for 'MatMul' (op: 'MatMul') with input shapes: [?,3,3], [3,3].

######## EDIT

は申し訳ありませんが、私が何をしたいのか、行列や配列のバッチに行列をMATMULすること、です。だから私は実際に、私はテンソル 'X' に

y = tf.matmul(W, x) 

答えて

0

あなたの入力を行いたい

y = tf.matmul(x, W) 

をしたいいけない形状(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. 
0

は、行列のshapeは、あなたが定義されているようである心の中でWの形状をしてくださいfollow the rule (a, b) * (b, c) = (a, c)

する必要があります( 3,3)。これはルール(2, 3) * (3, 3) => (2, 3)

しかし、あなたの第二の例を、以下、形状が規則に従わない

これfeed_dict={x: [[1,2,3],[0,4,5]]}は、2次元アレイである、それの形状は、(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、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) 
+0

したがって、配列のバッチサイズは2で、形状は3x1です。だから私は配列3x1と3x3の形状で行列を掛けることができます。しかし、私は再び3x3の形をした行列を持っていますが、今度は行列であり、3x2の形の配列ではなく、バッチサイズ2で動作しません。 あなたが書いたことを私は理解しました。しかし、どのように行列を他の行列と掛けることができますか?バッチサイズXの場合 私は間違いがあると思います。私はy = tf.matmul(W、x)をしたかった y = tf.matmul(x、W) しかし、両方の例ではうまくいきません。では、配列の配列に行列を掛ける方法は? – tag

+0

@ tag「行列をバッチに乗じる」と言ったとき、最後まで乗算して結果を得ようとするのですか? 'matmul'はあなたのためにそれをしません、おそらく' for'ループを使用する必要があります。 – LYu