Размеры пользовательских слоев вывода Keras - PullRequest
1 голос
/ 09 апреля 2019

Обычно слои keras имеют выходное измерение в форме (None, c, h, w) или (None, h, w, c), в зависимости от конфигурации channels_first или channels_last.

Я пытаюсь использовать пользовательские слои keras с двумявходы.Когда я распечатываю сводку модели, она не показывает измерение None.

Как мне запрограммировать свой пользовательский слой для включения этого измерения None?

Я думаю, что это может быть причинойпочему я получаю сообщение об ошибке

No data provided for "crfrnn". Need data for each key in: ['crfrnn']

crfrnn - это имя моего пользовательского слоя

Я попытался изменить вывод в методе call(), к сожалению, безрезультатно.

Я убедился, что входные данные сформированы и подготовлены правильно.Обратите внимание, что мой код тренировался нормально, прежде чем я попытался добавить этот слой поверх слоя plant_output (см. Резюме ниже)

Ниже приведен код для пользовательского слоя, он был принят с thisрепозиторий github :

class CrfRnnLayer(tf.keras.layers.Layer):
    """ Implements the CRF-RNN layer described in:

    Conditional Random Fields as Recurrent Neural Networks,
    S. Zheng, S. Jayasumana, B. Romera-Paredes, V. Vineet, Z. Su, D. Du, C. Huang and P. Torr,
    ICCV 2015
    """

    def __init__(self, image_dims, num_classes,
                 theta_alpha, theta_beta, theta_gamma,
                 num_iterations, NCHW, **kwargs):
        self.image_dims = image_dims
        self.num_classes = num_classes
        self.theta_alpha = theta_alpha
        self.theta_beta = theta_beta
        self.theta_gamma = theta_gamma
        self.num_iterations = num_iterations
        self.NCHW = NCHW
        self.spatial_ker_weights = None
        self.bilateral_ker_weights = None
        self.compatibility_matrix = None
        super(CrfRnnLayer, self).__init__(**kwargs)

    def build(self, input_shape):

        if not self.NCHW:
            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[0][channel_axis]
            self.input_spec = [tf.keras.layers.InputSpec(shape=(None, input_shape[0][1], input_shape[0][2], input_shape[0][3])), tf.keras.layers.InputSpec(shape=(None, input_shape[1][1], input_shape[1][2], input_shape[1][3]))]

        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[0][channel_axis]
            self.input_spec = [tf.keras.layers.InputSpec(shape=(None, input_shape[0][1], input_shape[0][2], input_shape[0][3])), tf.keras.layers.InputSpec(shape=(None, input_shape[1][1], input_shape[1][2], input_shape[1][3]))]

        # Weights of the spatial kernel
        self.spatial_ker_weights = self.add_weight(name='spatial_ker_weights',
                                                   shape=(self.num_classes, self.num_classes),
                                                   initializer=_diagonal_initializer,
                                                   trainable=True)

        # Weights of the bilateral kernel
        self.bilateral_ker_weights = self.add_weight(name='bilateral_ker_weights',
                                                     shape=(self.num_classes, self.num_classes),
                                                     initializer=_diagonal_initializer,
                                                     trainable=True)

        # Compatibility matrix
        self.compatibility_matrix = self.add_weight(name='compatibility_matrix',
                                                    shape=(self.num_classes, self.num_classes),
                                                    initializer=_potts_model_initializer,
                                                    trainable=True)

        super(CrfRnnLayer, self).build(input_shape)

    def call(self, inputs):

        unaries = tf.transpose(inputs[0][0, :, :, :], perm=(2, 0, 1))
        rgb = tf.transpose(inputs[1][0, :, :, :], perm=(2, 0, 1))

        #input is channels first
        c, h, w = self.num_classes, self.image_dims[0], self.image_dims[1]

        all_ones = np.ones((c, h, w), dtype=np.float32)

        # Prepare filter normalization coefficients
        spatial_norm_vals = custom_module.high_dim_filter(all_ones, rgb, bilateral=False,
                                                          theta_gamma=self.theta_gamma)
        bilateral_norm_vals = custom_module.high_dim_filter(all_ones, rgb, bilateral=True,
                                                            theta_alpha=self.theta_alpha,
                                                            theta_beta=self.theta_beta)
        q_values = unaries

        for i in range(self.num_iterations):
            softmax_out = tf.nn.softmax(q_values, 0)

            # Spatial filtering
            spatial_out = custom_module.high_dim_filter(softmax_out, rgb, bilateral=False,
                                                        theta_gamma=self.theta_gamma)
            spatial_out = spatial_out / spatial_norm_vals

            # Bilateral filtering
            bilateral_out = custom_module.high_dim_filter(softmax_out, rgb, bilateral=True,
                                                          theta_alpha=self.theta_alpha,
                                                          theta_beta=self.theta_beta)
            bilateral_out = bilateral_out / bilateral_norm_vals

            # Weighting filter outputs
            message_passing = (tf.matmul(self.spatial_ker_weights,
                                         tf.reshape(spatial_out, (c, -1))) +
                               tf.matmul(self.bilateral_ker_weights,
                                         tf.reshape(bilateral_out, (c, -1))))

            # Compatibility transform
            pairwise = tf.matmul(self.compatibility_matrix, message_passing)

            # Adding unary potentials
            pairwise = tf.reshape(pairwise, (c, h, w))
            q_values = unaries - pairwise

        #output is channels last
        return tf.transpose(tf.reshape(q_values, (1, c, h, w)), perm=(0, 2, 3, 1))

    def compute_output_shape(self, input_shape):
        return input_shape

Этот слой имеет два входа, каждый с размером (None, 384, 512, 3).Я ожидаю, что результат будет таким же, но когда я скомпилирую модель, получится следующее резюме (обратите внимание, что я не показал много слоев в середине, потому что я нарушил ограничение на количество символов на этой платформе, наиболее важные слоиinput_node, plant_output и пользовательские crfrnn):

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_node (InputLayer)         (None, 384, 512, 3)  0                                            
__________________________________________________________________________________________________
encoder_conv1 (Conv2D)          (None, 384, 512, 32) 128         input_node[0][0]                 
__________________________________________________________________________________________________
bneck1_dense_encoder1 (Conv2D)  (None, 384, 512, 8)  264         encoder_conv1[0][0]              
__________________________________________________________________________________________________
batch_normalization (BatchNorma (None, 384, 512, 8)  32          bneck1_dense_encoder1[0][0]      
__________________________________________________________________________________________________
leaky_re_lu (LeakyReLU)         (None, 384, 512, 8)  0           batch_normalization[0][0]        
__________________________________________________________________________________________________
conv1_dense_encoder1 (Conv2D)   (None, 384, 512, 4)  292         leaky_re_lu[0][0]                
__________________________________________________________________________________________________
dropout (Dropout)               (None, 384, 512, 4)  0           conv1_dense_encoder1[0][0]       
__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 384, 512, 36) 0           encoder_conv1[0][0]              
                                                                 dropout[0][0]                    
__________________________________________________________________________________________________
bneck2_dense_encoder1 (Conv2D)  (None, 384, 512, 8)  296         concatenate[0][0]                
__________________________________________________________________________________________________
batch_normalization_1 (BatchNor (None, 384, 512, 8)  32          bneck2_dense_encoder1[0][0]      
__________________________________________________________________________________________________
leaky_re_lu_1 (LeakyReLU)       (None, 384, 512, 8)  0           batch_normalization_1[0][0]      
__________________________________________________________________________________________________
conv2_dense_encoder1 (Conv2D)   (None, 384, 512, 4)  292         leaky_re_lu_1[0][0]              
__________________________________________________________________________________________________
dropout_1 (Dropout)             (None, 384, 512, 4)  0           conv2_dense_encoder1[0][0]       
__________________________________________________________________________________________________
concatenate_1 (Concatenate)     (None, 384, 512, 40) 0           concatenate[0][0]                
                                                                 dropout_1[0][0]                  
__________________________________________________________________________________________________
bneck3_dense_encoder1 (Conv2D)  (None, 384, 512, 8)  328         concatenate_1[0][0]              
__________________________________________________________________________________________________
batch_normalization_2 (BatchNor (None, 384, 512, 8)  32          bneck3_dense_encoder1[0][0]      
__________________________________________________________________________________________________
leaky_re_lu_2 (LeakyReLU)       (None, 384, 512, 8)  0           batch_normalization_2[0][0]      
__________________________________________________________________________________________________
conv3_dense_encoder1 (Conv2D)   (None, 384, 512, 4)  292         leaky_re_lu_2[0][0]              
__________________________________________________________________________________________________
dropout_2 (Dropout)             (None, 384, 512, 4)  0           conv3_dense_encoder1[0][0]       
__________________________________________________________________________________________________
concatenate_2 (Concatenate)     (None, 384, 512, 12) 0           dropout[0][0]                    
                                                                 dropout_1[0][0]                  
                                                                 dropout_2[0][0]                  
__________________________________________________________________________________________________
encoder_concat1 (Concatenate)   (None, 384, 512, 44) 0           encoder_conv1[0][0]              
                                                                 concatenate_2[0][0]              
__________________________________________________________________________________________________
encoder_bneck1 (Conv2D)         (None, 384, 512, 22) 990         encoder_concat1[0][0]            
__________________________________________________________________________________________________
encoder_downsample1 (Conv2D)    (None, 192, 256, 22) 12122       encoder_bneck1[0][0]             
__________________________________________________________________________________________________
bneck1_dense_encoder2 (Conv2D)  (None, 192, 256, 8)  184         encoder_downsample1[0][0]        
__________________________________________________________________________________________________
batch_normalization_3 (BatchNor (None, 192, 256, 8)  32          bneck1_dense_encoder2[0][0]      
__________________________________________________________________________________________________
leaky_re_lu_3 (LeakyReLU)       (None, 192, 256, 8)  0           batch_normalization_3[0][0]      
__________________________________________________________________________________________________
conv1_dense_encoder2 (Conv2D)   (None, 192, 256, 4)  292         leaky_re_lu_3[0][0]              
__________________________________________________________________________________________________
dropout_3 (Dropout)             (None, 192, 256, 4)  0           conv1_dense_encoder2[0][0]       
__________________________________________________________________________________________________
concatenate_3 (Concatenate)     (None, 192, 256, 26) 0           encoder_downsample1[0][0]        
                                                                 dropout_3[0][0]                  
__________________________________________________________________________________________________
bneck2_dense_encoder2 (Conv2D)  (None, 192, 256, 8)  216         concatenate_3[0][0]              
__________________________________________________________________________________________________
batch_normalization_4 (BatchNor (None, 192, 256, 8)  32          bneck2_dense_encoder2[0][0]      
__________________________________________________________________________________________________
leaky_re_lu_4 (LeakyReLU)       (None, 192, 256, 8)  0           batch_normalization_4[0][0]      
__________________________________________________________________________________________________
conv2_dense_encoder2 (Conv2D)   (None, 192, 256, 4)  292         leaky_re_lu_4[0][0]              
__________________________________________________________________________________________________
dropout_4 (Dropout)             (None, 192, 256, 4)  0           conv2_dense_encoder2[0][0]       
__________________________________________________________________________________________________
concatenate_4 (Concatenate)     (None, 192, 256, 30) 0           concatenate_3[0][0]              
                                                                 dropout_4[0][0]                  
__________________________________________________________________________________________________
bneck3_dense_encoder2 (Conv2D)  (None, 192, 256, 8)  248         concatenate_4[0][0]              
__________________________________________________________________________________________________
batch_normalization_5 (BatchNor (None, 192, 256, 8)  32          bneck3_dense_encoder2[0][0]      
__________________________________________________________________________________________________
leaky_re_lu_5 (LeakyReLU)       (None, 192, 256, 8)  0           batch_normalization_5[0][0]      
__________________________________________________________________________________________________
conv3_dense_encoder2 (Conv2D)   (None, 192, 256, 4)  292         leaky_re_lu_5[0][0]              
__________________________________________________________________________________________________
dropout_5 (Dropout)             (None, 192, 256, 4)  0           conv3_dense_encoder2[0][0]       
__________________________________________________________________________________________________
concatenate_5 (Concatenate)     (None, 192, 256, 12) 0           dropout_3[0][0]                  
                                                                 dropout_4[0][0]                  
                                                                 dropout_5[0][0]                  
__________________________________________________________________________________________________
encoder_concat2 (Concatenate)   (None, 192, 256, 34) 0           encoder_downsample1[0][0]        
                                                                 concatenate_5[0][0]              
__________________________________________________________________________________________________
encoder_bneck2 (Conv2D)         (None, 192, 256, 17) 595         encoder_concat2[0][0]            
__________________________________________________________________________________________________
encoder_downsample2 (Conv2D)    (None, 96, 128, 17)  7242        encoder_bneck2[0][0]             
__________________________________________________________________________________________________
bneck1_dense_encoder3 (Conv2D)  (None, 96, 128, 8)   144         encoder_downsample2[0][0]        
__________________________________________________________________________________________________
batch_normalization_6 (BatchNor (None, 96, 128, 8)   32          bneck1_dense_encoder3[0][0]      
__________________________________________________________________________________________________
leaky_re_lu_6 (LeakyReLU)       (None, 96, 128, 8)   0           batch_normalization_6[0][0]      
__________________________________________________________________________________________________
conv1_dense_encoder3 (Conv2D)   (None, 96, 128, 4)   292         leaky_re_lu_6[0][0]              
__________________________________________________________________________________________________
dropout_6 (Dropout)             (None, 96, 128, 4)   0           conv1_dense_encoder3[0][0]       
__________________________________________________________________________________________________
concatenate_6 (Concatenate)     (None, 96, 128, 21)  0           encoder_downsample2[0][0]        
                                                                 dropout_6[0][0]                  
__________________________________________________________________________________________________
bneck2_dense_encoder3 (Conv2D)  (None, 96, 128, 8)   176         concatenate_6[0][0]              
__________________________________________________________________________________________________
batch_normalization_7 (BatchNor (None, 96, 128, 8)   32          bneck2_dense_encoder3[0][0]      
__________________________________________________________________________________________________
leaky_re_lu_7 (LeakyReLU)       (None, 96, 128, 8)   0           batch_normalization_7[0][0]      
__________________________________________________________________________________________________
conv2_dense_encoder3 (Conv2D)   (None, 96, 128, 4)   292         leaky_re_lu_7[0][0]              
__________________________________________________________________________________________________
dropout_7 (Dropout)             (None, 96, 128, 4)   0           conv2_dense_encoder3[0][0]       
__________________________________________________________________________________________________
concatenate_7 (Concatenate)     (None, 96, 128, 25)  0           concatenate_6[0][0]              
                                                                 dropout_7[0][0]                  
__________________________________________________________________________________________________
bneck3_dense_encoder3 (Conv2D)  (None, 96, 128, 8)   208         concatenate_7[0][0]              
__________________________________________________________________________________________________
batch_normalization_8 (BatchNor (None, 96, 128, 8)   32          bneck3_dense_encoder3[0][0]      
__________________________________________________________________________________________________
leaky_re_lu_8 (LeakyReLU)       (None, 96, 128, 8)   0           batch_normalization_8[0][0]      
__________________________________________________________________________________________________
conv3_dense_encoder3 (Conv2D)   (None, 96, 128, 4)   292         leaky_re_lu_8[0][0]              
__________________________________________________________________________________________________
dropout_8 (Dropout)             (None, 96, 128, 4)   0           conv3_dense_encoder3[0][0]       
__________________________________________________________________________________________________
concatenate_8 (Concatenate)     (None, 96, 128, 12)  0           dropout_6[0][0]                  
                                                                 dropout_7[0][0]                  
                                                                 dropout_8[0][0]                  
__________________________________________________________________________________________________

__________________________________________________________________________________________________
plant_conv (Conv2D)             (None, 384, 512, 32) 416         concatenate_20[0][0]             
__________________________________________________________________________________________________
plant_output (Conv2D)           (None, 384, 512, 3)  99          plant_conv[0][0]                 
__________________________________________________________________________________________________
crfrnn (CrfRnnLayer)            (1, 384, 512, 3)     27          plant_output[0][0]               
                                                                 input_node[0][0]                 
==================================================================================================
Total params: 41,833
Trainable params: 41,497
Non-trainable params: 336
__________________________________________________________________________________________________

Обратите внимание, как слой crfrnn имеет форму (1, 384, 512, 3).Я считаю, что это приводит к тому, что программа не работает, выдает ошибку:

Epoch 1/2000
No data provided for "crfrnn". Need data for each key in: ['crfrnn']

1 Ответ

0 голосов
/ 14 апреля 2019

Проблема была двоякой, первая более важная для общего доступа.

В приведенном выше коде в функции call () вы видите:

unaries = tf.transpose(inputs[0][0, :, :, :], perm=(2, 0, 1))
rgb = tf.transpose(inputs[1][0, :, :, :], perm=(2, 0, 1))

Я удалил этои вместо этого написал:

unaries = inputs[0]    
rgb = inputs[1]

Это предполагает, что каналы вводятся сначала как каналы, и, следовательно, их не нужно транспонировать.Кроме того, но, читая их таким образом, keras смог вывести форму, и теперь в качестве формы для этого слоя теперь в качестве формы для этого слоя (None, c, h, w).

Ошибка No data provided for "crfrnn". Need data for each key in: ['crfrnn'] была фактическиглупая ошибка с моей стороны, где в словаре меток, который я кормил, был неправильный ключ (должен был быть crfrnn).Я разместил это на оригинальном github для репозитория crfrnn, потому что другим было любопытно, как перенести этот слой в свои собственные сети, и я сделал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...