InvalidArgumentError: несовместимые формы в керасах пользовательского слоя при вызове модели - PullRequest
0 голосов
/ 09 июля 2020

Я хотел бы реализовать собственный слой из keras и tenorflow API. Этот слой объединяет свою выходную свертку с матрицей n (предоставляемой аргументом n_index) из канала входного тензора. (канал последний) Кажется, быстрый тест с тензором Ones работает, но не работает в моей тестовой модели. Большое спасибо.

tf version = 2.2.0 keras version = 2.4.3

from keras.layers import Layer, Conv2D
import tensorflow as tf

class PseudoCoordConv(Layer):

    def __init__(self, 
                n_index: int,
                filters: int,
                kernel_size=(3, 3),
                padding='same',
                activation='relu',
                kernel_initializer=k_init,
                bias_initializer=b_init,
                **kwargs):

       super(PseudoCoordConv, self).__init__(**kwargs)
       self.filters = filters
       self.kernel_size = kernel_size
       self.padding = padding
       self.activation = activation
       self.kernel_initializer = kernel_initializer
       self.bias_initializer = bias_initializer
       self.n_index = n_index
       self.conv_layer = Conv2D(filters=filters,
                                kernel_size=kernel_size,
                                strides=(1, 1),
                                dilation_rate=(1, 1),
                                padding=padding,
                                activation=activation,
                                use_bias=True,
                                kernel_initializer=kernel_initializer,
                                bias_initializer=bias_initializer)
       self.built = True

   def call(self, inputs):
       coord_maps = []
       for index in range(self.n_index):
           coord_map = inputs[:, :, :, index]
           coord_map = tf.expand_dims(coord_map, axis=-1)
           coord_maps.append(coord_map)
       coord_maps = tf.concat(coord_maps, axis=-1)
       x = self.conv_layer(inputs)
       return tf.concat([x, coord_maps], axis=-1)

   def compute_output_shape(self, input_shape):
       return tf.TensorShape[*input_shape, self.filters + self.n_index]

   def get_config(self):
       config = super(PseudoCoordConv, self).get_config()
       config.update({'filters': self.filters,
                     'kernel_size': self.kernel_size,
                     'padding': self.padding,
                     'activation': self.activation,
                     'kernel_initializer': self.kernel_initializer,
                     'bias_initializer': self.bias_initializer,
                     'n_index': self.n_index})
       return config

быстрый тест:

if __name__ == '__main__':
   x = tf.ones((32, 64, 64, 3))
   layer = PseudoCoordConv(2, 1)
   y = layer(x)
   print(y.shape)

: tf.Tensor(
[[[[0.09264521 1.         1.        ]
   [0.         1.         1.        ]]

  [[0.07449672 1.         1.        ]
   [0.04539756 1.         1.        ]]]], shape=(1, 2, 2, 3), dtype=float32

моя тестовая модель:

def pseudoCoordConv_test(input_shape: tuple):
   input_layer = Input(name='input_layer', shape=input_shape)
   x = PseudoCoordConv(n_index=2, filters=1)(input_layer)
   return Model(inputs=input_layer, outputs=x) 

Ошибка после .compile и .fit

: InvalidArgumentError:  Incompatible shapes: [1,64,64,3] vs. [1,64,64]

  Errors may have originated from an input operation.

  Function call stack:
  train_function
...