2017-02-12 12 views
3

特定の次元を持つ2つの行列の行列乗算がnumpyで機能しますが、テンソルフローでは機能しません。行列の乗算テンソルとnumpyの差

x = np.ndarray(shape=(10,20,30), dtype = float) 
y = np.ndarray(shape=(30,40), dtype = float) 
z = np.matmul(x,y) 
print("np shapes: %s x %s = %s" % (np.shape(x), np.shape(y), np.shape(z))) 

これは期待どおりに動作して印刷:私は上記のnumpyの配列はエラーに

x = tf.placeholder(tf.float32, shape=(10,20,30)) 
y = tf.Variable(tf.truncated_normal([30,40], name='w')) 
print("tf shapes: %s x %s" % (x.get_shape(), y.get_shape())) 
tf.matmul(x,y) 
を取得するのと同じ形状のプレースホルダや変数を乗算しようとすると、tensorflowにしかし

np shapes: (10, 20, 30) x (30, 40) = (10, 20, 40) 

結果は

tf shapes: (10, 20, 30) x (30, 40) 
InvalidArgumentError: 
Shape must be rank 2 but is rank 3 for 'MatMul_12' 
(op: 'MatMul') with input shapes: [10,20,30], [30,40]. 

この操作はなぜ失敗しますか?

+0

numpy matmulは何ですか?第2のエントリーを10,20,30に放送し、10マットマットで20,30を(30,40)倍しますか? TF matmulが放送を見逃しているようだが、機能要求を提出する価値があるかもしれない。 'y = tf.Variable(tf.truncated_normal([30,40]、name = 'w')+ tf.zeros((10,30,40)))'を実行することで、ブロードキャストをトリガーすることができます。関連する問題(誤って閉じている可能性があります) - https://github.com/tensorflow/tensorflow/issues/216 –

+0

ここでmatmulは 'np.einsum( 'ijk、kl-> ijl'、x、y) ' – Kuba

答えて

1

なぜtf.matmulはこの種の乗算をサポートしていないのですか(コア開発者の1人が意味のある回答を与える可能性があります)。

しかし、このようにテンソルを掛けたいだけなら、tf.einsum関数を見てみてください。それは任意の階数のテンソルで動作することができる。

0

Dmytro tf.einsumで示唆されているように、これらの2つの配列を乗算するために使用できます。

x = np.ndarray(shape=(10,20,30), dtype = float) 
y = np.ndarray(shape=(30,40), dtype = float) 

これら二つの操作

はまったく同じ結果を生成:

np.einsum('ijk,kl->ijl', x, y) 
np.matmul(x,y) 

と、対応するtensorflow操作も作品を

tf.einsum('ijk,kl->ijl', tf_x,tf_y) 
0

人々はすでにあなたがそのあなたを得るためにtf.einsum()を使用できることを言った 欲しいです。

import tensorflow as tf 
x = tf.random_normal([10, 20, 30]) 
y = tf.random_normal([30, 40]) 
z = tf.einsum('ijk,kl->ijl', x, y) 

tf.matmul()あなたが期待されるように動作しない理由は、ドキュメントに書かれています。

入力はおそらく 転置した後、内寸に一致すると、(行列の バッチを表し、またはランク> 2のテンソル)行列でなければなりません。

場合によっては、行列yとテンソルx(ランク3> 2)があります。あなたの場合、内面の寸法が一致しません。

import tensorflow as tf 
a, b, c = 12, 50, 20 
x = tf.random_normal([a, b, c]) 
y = tf.random_normal([a, c, b]) 
z = tf.matmul(x, y) 

をしかし、はっきりそれはないあなたが望むものを計算します。必要であれば、それらが一致するには、このような何かを持っている必要があります。