На мой взгляд, с вашим кодом есть две основные проблемы.
Во-первых, это уменьшение размеров, с (200 200) до (154 154), которые можно легко решить, заполнив = 'same' для каждогоСлой Conv2D как этот:
autoencoder = Sequential()
autoencoder.add(Conv2D(64, (3, 3), input_shape=(200, 200, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2)))
autoencoder.add(Conv2D(32, (3, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2)))
autoencoder.add(Conv2D(32, (3, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2))) # encoded
autoencoder.add(Conv2D(32, (3, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))
autoencoder.add(Conv2D(32, (3, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))
autoencoder.add(Conv2D(64, (3, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))
autoencoder.add(Conv2D(1, (3, 3), padding='same'))
autoencoder.add(Activation('sigmoid'))
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
Вторая проблема с вашей целью.То, что вы пытаетесь предсказать здесь, с выводом (200,200,1)
на вашем последнем Conv2D
слое, с sigmoid activation
и binary_crossentropy loss
- это изображение в градациях серого.Если это то, что вы хотите, вы должны тренировать свою модель с y_train, представляющим собой 1-канальные изображения (200 200,1), в противном случае вы можете изменить свой выходной сигнал на (200 200 300) следующим образом:
изменить:
autoencoder.add(Conv2D(1, (3, 3), padding='same'))
до:
autoencoder.add(Conv2D(3, (3, 3), padding='same'))