Автоэнкодер с неправильными размерами в последнем слое, если cnn имеет 3 слоя - PullRequest
0 голосов
/ 17 июня 2020

Следующий код представляет собой автоматический кодировщик шумоподавления изображений. 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

...