Игнорирование ... Слои с аргументами в `__init__` должны переопределить` get_config` - PullRequest
0 голосов
/ 23 апреля 2020

Я тренирую сверточную нейронную сеть, используя остаточные единицы, определенные классом ниже (согласно стр. 478 в «Практическом машинном обучении с Scikit-Learn, Keras и Tensorflow» Аурелиена Джерона)

class ResidualUnit(tf.keras.layers.Layer):

    def __init__(self, filters, strides=1, activation="relu", **kwargs):

        super().__init__(**kwargs)
        self.activation = tf.keras.activations.get(activation)

        self.main_layers = [
            tf.keras.layers.Conv2D(filters, 3, strides=strides, padding="same", use_bias=False),
            tf.keras.layers.BatchNormalization(),
            self.activation,
            tf.keras.layers.Conv2D(filters, 3, strides=1, padding="same", use_bias=False),
            tf.keras.layers.BatchNormalization()]

        self.skip_layers=[]

        if strides > 1:
            self.skip_layers = [
                tf.keras.layers.Conv2D(filters, 1, strides=strides, padding="same", use_bias=False),
                tf.keras.layers.BatchNormalization()]


    def call(self, inputs):

        Z = inputs

        for layer in self.main_layers:
            Z = layer(Z)
        skip_Z = inputs

        for layer in self.skip_layers:
            skip_Z = layer(skip_Z)

        return self.activation(Z + skip_Z)

Класс создается без ошибок, а архитектура модели (с использованием этого класса) создается без ошибок:

ResNet_model = tf.keras.models.Sequential()

ResNet_model.add(tf.keras.layers.Conv2D(64, 3, strides=2, input_shape=num_pixels_and_channels,
                                       padding="same", use_bias=False))


ResNet_model.add(tf.keras.layers.BatchNormalization())

ResNet_model.add(tf.keras.layers.Activation("relu"))

ResNet_model.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2, padding="same"))

prev_filters=64

for filters in [64] * 1 + [128] * 1 + [256] * 1 + [512] * 1:
    strides = 1 if filters == prev_filters else 2
    ResNet_model.add(ResidualUnit(filters, strides=strides))
    prev_filters=filters

ResNet_model.add(tf.keras.layers.GlobalAvgPool2D())
ResNet_model.add(tf.keras.layers.Flatten())
ResNet_model.add(tf.keras.layers.Dense(257, activation="softmax"))

... но при обучении модели отображается предупреждение, как только обучение начинается:

ВНИМАНИЕ: тензор потока: не удалось сериализовать модель как JSON. Игнорирование ... Слои с аргументами в __init__ должны переопределить get_config.

Модель обучается 1-й эпохе, а затем останавливается.

Что не так и что мне делать Нужно изменить код, чтобы это исправить?

Я использую TennSflow версии 2.1.0 в ноутбуке Jupyter на ЦП.

...