Я тренирую сверточную нейронную сеть, используя остаточные единицы, определенные классом ниже (согласно стр. 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 на ЦП.