2016-11-25 18 views
4

密集レイヤーの出力をConvolution2Dレイヤーと融合させるカスタムレイヤーを作りたいと思います。Keras - Convolution2Dレイヤーと密なレイヤーの融合

アイデアがthis paperから来て、ここでは、ネットワークの:

The Network

融着層は、高密度テンソル(256)とConvolution2Dテンソル(256x28x28)を融合しようとします。私は、新しいカスタム層を作ることになった

capture3

:ここ

The Fusion Formula

y_global => Dense layer output with shape 256 y_mid => Convolution2D layer output with shape 256x28x28

フュージョンプロセスに関する論文の記述があります:ここにそれのための方程式です以下のようになります。

class FusionLayer(Layer): 

    def __init__(self, output_dim, **kwargs): 
     self.output_dim = output_dim 
     super(FusionLayer, self).__init__(**kwargs) 

    def build(self, input_shape): 
     input_dim = input_shape[1][1] 
     initial_weight_value = np.random.random((input_dim, self.output_dim)) 
     self.W = K.variable(initial_weight_value) 
     self.b = K.zeros((input_dim,)) 
     self.trainable_weights = [self.W, self.b] 

    def call(self, inputs, mask=None): 
     y_global = inputs[0] 
     y_mid = inputs[1] 
     # the code below should be modified 
     output = K.dot(K.concatenate([y_global, y_mid]), self.W) 
     output += self.b 
     return self.activation(output) 

    def get_output_shape_for(self, input_shape): 
     assert input_shape and len(input_shape) == 2 
     return (input_shape[0], self.output_dim) 

私は__init__build方法は右だと思いますが、出力が言及した式と同じになるように、私はcall層にy-mid(256x28x28寸法)とy_global(256 dimesnions)を連結する方法がわかりません上記。

この式をcallメソッドでどのように実装できますか?

本当にありがとうございました...

がUPDATE:成功したこれらの2層のデータを統合する他の方法は、それが正確に紙に記載された方法である必要はありません...私のためにも受け入れられますしかし、少なくとも許容可能な出力を返す必要があります...

答えて

2

Keras Githubのページでこの質問をしなければなりませんでした。誰かが正しく実装する方法を教えてくれました。ここにはギフトボックスのissue ...

1

私の意見では、新しい種類のレイヤーを実装することは、この作業を複雑にする方法です。予想される動作を得るために、

:私は強くあなたが以下の層を使用することをお勧めします。

関連する問題