Следующий код представляет собой автоматический кодировщик шумоподавления изображений. Nn хорошо работает с 2 слоями, но когда их больше 2, выходной слой не имеет правильных размеров. Не знаю почему.
def create_model(filters=[32, 64], learning_rate=0.001):
model = Sequential()
model.add(layers.InputLayer((28, 28, 1)))
for filter_ in filters:
model.add(layers.Conv2D(filter_, (3,3), padding="same", strides=2))
model.add(layers.Activation("relu"))
model.add(layers.BatchNormalization(axis=-1))
model.add(layers.Flatten())
model.add(layers.Dense(16))
model.add(layers.Lambda(lambda x: x))
model.add(layers.Dense(model.layers[-3].output_shape[1]))
model.add(layers.Lambda(lambda x: x))
model.add(layers.Reshape(model.layers[-8].output_shape[1:]))
for filter_ in filters[::-1]:
model.add(layers.Conv2DTranspose(filter_, (3,3), padding="same", strides=2))
model.add(layers.Activation("relu"))
model.add(layers.BatchNormalization(axis=-1))
model.add(layers.Conv2DTranspose(1, (3,3), padding="same"))
model.add(layers.Activation("sigmoid"))
opt = optimizers.Adam(learning_rate=learning_rate)
model.compile(loss="mse",optimizer=opt, metrics=["mse"])
return model
model = create_model(filters=[32, 64, 128])
Вот график модели для изображения с формой 28x28. Последний слой имеет форму 32x32