ValueError: Ошибка при проверке цели: ожидается, что Activation_7 будет иметь форму (154, 154, 1), но получил массив с формой (200, 200, 3) - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь построить CNN Autoencoder. Каждое тренировочное изображение (цвет) имеет размер 200 * 200. Я получил ошибку при компиляции: ValueError: Error when checking target: expected activation_7 to have shape (154, 154, 1) but got array with shape (200, 200, 3) со следующим кодом. Как можно изменить код для работы?

autoencoder = Sequential()

autoencoder.add(Conv2D(64, (3, 3), input_shape=(200, 200, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2)))

autoencoder.add(Conv2D(32, (3, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2)))

autoencoder.add(Conv2D(32, (3, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2))) # encoded

autoencoder.add(Conv2D(32, (3, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))

autoencoder.add(Conv2D(32, (3, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))

autoencoder.add(Conv2D(64, (3, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))

autoencoder.add(Conv2D(1, (3, 3)))
autoencoder.add(Activation('sigmoid'))

autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

1 Ответ

2 голосов
/ 25 июня 2019

На мой взгляд, с вашим кодом есть две основные проблемы.

Во-первых, это уменьшение размеров, с (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'))
...