2017-10-02 1 views
2

Je construis un calque Keras personnalisé avec un support Tensorflow. Avant cela, je voulais tester si une couche Convolution2D fonctionne correctement si j'écris un calque Keras avec conv2d de Tensorflow dans la fonction d'appel.Keras incapable de calculer le nombre de paramètres dans un calque personnalisé 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)] 

Cette compile correctement, mais quand j'utilise le model.summary() ne calcule pas le nombre de paramètres pour cette couche.

Que dois-je faire pour que, lorsque je vérifie le nombre total de paramètres du modèle, le nombre inclut le nombre de paramètres pouvant être entraînés pour cette couche?

Répondre

0

J'ai trouvé la réponse à ce problème.

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 

Les poids add définit le nombre de paramètres que je ne l'ai pas fait dans mon code. Mais cela n'entrave pas la performance du modèle. Cela fonctionne bien, sauf pour le fait que l'on ne peut pas obtenir le nombre de spécifications de paramètres.

+0

S'il vous plaît corriger l'indentation .. – DJK

+0

Vous devez accepter votre propre réponse - rien de mal à cela, au contraire, il est encouragé https://stackoverflow.com/help/self-answer – desertnaut