私はTensorflowバックエンドでKeras 2.0.2を使用しています。私は、レイヤーの一部としてバッチ処理されたドットプロダクトを実行しようとしています。私はこれをどうやって行うのか完全にはわかっていないし、私が見たことのどれも希望する機能を持っていないようだ。ケラス - 放送付きのドットレイヤーはありませんか?
特に、私は2つのレイヤー(None、2,50,5,3)と(None、2,50,3,1)を持っています。 (None、2、50)次元でブロードキャストされている - つまり、(None、2、50、5、1)の出力が必要です。私の使用例はとてもシンプルです。シーケンスの各タイムステップで行列(5,3)とベクトル(3,1)を計算しています。タイムスタンプごとにドットプロダクトを取りたいと思います。
は、ここで私は全体来ています何を示す例である:
import keras
import keras.backend as K
from keras.layers import Dot, Input
v1 = K.variable(value=np.random.rand(2, 50, 5, 3))
v2 = K.variable(value=np.random.rand(2, 50, 3, 1))
K.batch_dot(v1, v2) # this works as desired, gives output shape: (2, 50, 5, 1)
x1 = Input((2, 50, 3, 5)) # shape: (None, 2, 50, 3, 5)
x2 = Input((2, 50, 3, 1)) # shape: (None, 2, 50, 3, 1)
Dot(3)([x1, x2]) # output shape is (None, 2, 50, 5, 2, 50, 1)
ドット層(https://github.com/fchollet/keras/blob/master/keras/layers/merge.py)のコードが実際にK.batch_dotを使用しますが、動作は同じではありませんので、それは奇妙です。
また、これはドキュメントに記載された行動と矛盾するようだ:2個のテンソルa
と形状(batch_size, n)
のb
に適用 「、例えばもし、 出力は、各エントリi
ドットになります形状(batch_size, 1)
のテンソルになります a[i]
とb[i]
の間の製品。
私は、例えば、無成功と他のものを試してみました(?のみ単一の入力を取ることができた - そこに同等の汎用層は、複数の入力を服用すべきではない)ラムダ層でK.batch_dotを包むかTimeDistributedので、動作しないようですTimeDistributed層におけるドット層を(包みますリストを入力として扱うことはできません)。
アドバイスをいただければ幸いです!
この質問に返信いただきありがとうございます!私も同じ問題がありました。あなたが最初の選択肢を意味するものを(コードで)明確にすれば素晴らしいことでしょう。 – LearnOPhile