2017-02-10 18 views
1

私は2D入力(またはサンプル数を考慮すると3D)を持っています。この入力を受け取り、別の2Dマトリックスを出力するケラスレイヤーを適用したいと思います。たとえば、サイズ(ExV)の入力がある場合、学習重み行列は(SxE)と出力(SxV)になります。密集層でこれを行うことはできますか?Kerasカスタムレイヤー2D入力 - > 2D出力

EDIT(ナッシム要求):

第一層は何もしません。ラムダレイヤーに入力を与えるだけです:

from keras.models import Sequential 
from keras.layers.core import Reshape,Lambda 
from keras import backend as K 
from keras.models import Model 

input_sample = [ 
[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]] 
,[[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35],[36,37,38,39,40]] 
,[[41,42,43,44,45],[46,47,48,49,50],[51,52,53,54,55],[56,57,58,59,60]] 
] 


model = Sequential() 
model.add(Reshape((4,5), input_shape=(4,5))) 
model.add(Lambda(lambda x: K.transpose(x))) 
intermediate_layer_model = Model(input=model.input,output=model.layers[0].output) 
print "First layer:" 
print intermediate_layer_model.predict(input_sample) 
print "" 
print "Second layer:" 
intermediate_layer_model = Model(input=model.input,output=model.layers[1].output) 
print intermediate_layer_model.predict(input_sample) 

答えて

1

それはあなたが何をしたいかに依存します。それはシーケンスなので2Dですか?次に、LSTMが作成され、return_sequence = Trueを設定すると、希望のサイズのシーケンスが返されます。

CNNは2D入力でも動作し、使用するカーネルの数に応じて可変サイズのものを出力します。

そうでない場合は、あなたが、(E用のx V、)1Dテンソルにそれを再形成SXV寸法と緻密層を使用し、(S、V)2Dテンソルに出力を再構築することができます...

私はできませんあなたにもっと助けてください、私たちはあなたのユースケースを知る必要があります:-)ニューラルネットワークには多すぎる可能性があります。

EDIT:

あなたはTimeDistributed(高密度(S))を使用することができます。 入力にシェイプ(E、V)がある場合は、(V、E)に変更してVを「時間ディメンション」にします。次に、加重(ExS)の密なレイヤーになるTimeDistributed(Dense(S))を適用すると、出力は形状(V、S)になりますので、(S、V)に変形できます。

あなたが望むものはありますか? TimeDistributed()レイヤーは、共有重み付きの入力のすべてのVラインに同じDense(S)レイヤーを適用します。

EDIT 2:

kerasバックエンドのコードを見た後、それが可能な「置換パターン」オプションでtensorflowから転置を使用することが判明、あなたはK.permute_dimensions(Xを、使用する必要がありますパターン)。バッチディメンションを含める必要があります。あなたのケースでは:

Lambda(lambda x: K.permute_dimensions(x,[0,2,1])) 

K.transpose(x)は(TFバックエンドのための)内部に同じ関数を使用するが、順列は、あるデフォルト値に設定されている[N、N-1、...、0] 。

+0

こんにちは、返信いただきありがとうございます。シーケンスではないので、LSTMを使用することはできません。私はCNNについても考えましたが、重みを共有するため、重み(SxE)行列を学習しません。再形成の可能性は、反対であるため、どちらのニューロンにもすべての重みが同時に適用されるため、どちらも機能しません。 – Miguel

+0

別の提案で編集:) –

+0

あなたはそれを探していますか? –