2017-10-02 12 views
2

いくつかのTensorflowサポートでKeras Customレイヤーを構築しています。その前に、コール機能にTensorflowのconv2dを使用してKerasレイヤーを書き込むと、Convolution2Dレイヤーが正常に動作するかどうかをテストしたかったのです。KerasがKerasカスタムレイヤーのパラメータ数を計算できません

class Convolutional2D(Layer): 
    def __init__(self, filters=None, kernel_size=None, padding='same', activation='linear', strides=(1,1), name ='Conv2D', **kwargs): 
     self.filters = filters 
     self.kernel_size = kernel_size 
     self.padding = padding 
     self.activation = activation 
     self.strides = strides 
     self.name = name 
     self.input_spec = [InputSpec(ndim=4)] 
     super(Convolutional2D, self).__init__(**kwargs) 

    def call(self, input): 
     out = tf.layers.conv2d(inputs=input, filters=self.filters, kernel_size=self.kernel_size, strides=self.strides, padding=self.padding, 
     data_format='channels_last') 
     return(out) 

    def compute_output_shape(self, input_shape): 
     batch_size = input_shape[0] 
     width = input_shape[1]/self.strides[0] 
     height = input_shape[2]/self.strides[1] 
     channels = self.filters 
     return(batch_size, width, height, channels) 

    def get_config(self): 
     config = {'filters': self.filters, 'kernel_size': self.kernel_size, 'padding': self.padding, 'activation':self.activation, 'strides':self.strides, 
     'name':self.name} 
     base_config = super(Convolutional2D, self).get_config() 
     return dict(list(base_config.items()) + list(config.items())) 

    def build(self, input_shape): 
     self.input_spec = [InputSpec(shape=input_shape)] 

これは正しくコンパイルが、私はmodel.summary()を使用する場合には、この層のためのパラメータの数を計算しません。

モデルのパラメータの総数を確認するときに、この層の学習可能なパラメータの数が含まれるようにするにはどうすればよいですか?

答えて

0

私はこの問題の答えを見つけました。

def build(self, input_shape): 
    if self.data_format == 'channels_first': 
     channel_axis = 1 
    else: 
     channel_axis = -1 
    if input_shape[channel_axis] is None: 
     raise ValueError('The channel dimension of the inputs ' 
         'should be defined. Found `None`.') 
    input_dim = input_shape[channel_axis] 
    kernel_shape = self.kernel_size + (input_dim, self.filters) 

    self.kernel = self.add_weight(shape=kernel_shape, 
            initializer=self.kernel_initializer, 
            name='kernel', 
            regularizer=self.kernel_regularizer, 
            constraint=self.kernel_constraint) 
    if self.use_bias: 
     self.bias = self.add_weight(shape=(self.filters,), 
            initializer=self.bias_initializer, 
            name='bias', 
            regularizer=self.bias_regularizer, 
            constraint=self.bias_constraint) 
    else: 
     self.bias = None 
    # Set input spec. 
    self.input_spec = InputSpec(ndim=self.rank + 2, 
           axes={channel_axis: input_dim}) 
    self.built = True 

追加の重みは、私は私のコードでは行っていないパラメータの数を定義します。しかし、それはモデルの性能を妨げるものではありません。それは、パラメータ指定の数を得ることができないという事実を除いて、うまく動作します。

+0

字下げを修正してください。 – DJK

+0

あなた自身の答えを受け入れるべきです - 逆にそれは間違っていません。https://stackoverflow.com/help/self-answer – desertnaut

関連する問題