2017-04-04 6 views
3

私は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層におけるドット層を(包みますリストを入力として扱うことはできません)。

アドバイスをいただければ幸いです!

答えて

3

だから私はそれを行うにはいくつかの方法を考え出した:

1)あなたがあなたの入力のいくつかの機能であるベクトル()に適用されている行列のパラメータを学びたいのであれば、することができますリニアアクティベーションと偏りのないTimeDistributed Denseレイヤーを適用するだけです。

2)マトリックスを入力の一部の機能にしたい場合(つまり、レイヤーからマトリックスへの出力を変更して、それをデータの関数であるベクターに適用する場合)、ラップすることができますラムダ層のK.batch_dot。層は単一のリスト引数を入力として取ります。 すなわち、のようなもの: Lambda(lambda x: K.batch_dot(x[0], x[1]))([x1, x2])。 私が以前にやっていたことの問題は、私がリストとしての入力を持っていなかったことと、Lamdba層が1つ以上の入力を取ることができないことでした。

ありドキュメンテーションの問題はまだだ - とも使うケース(2)(IMO)を見つけることが容易でなければなりません。しかし、上記の解決策はうまくいくはずです。

+0

この質問に返信いただきありがとうございます!私も同じ問題がありました。あなたが最初の選択肢を意味するものを(コードで)明確にすれば素晴らしいことでしょう。 – LearnOPhile

関連する問題