我正在尝试构建CNN自动编码器。每个训练图像(彩色)的尺寸为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')
答案 0 :(得分:2)
如我所见,上面的代码有两个主要问题。
首先是尺寸减小,从(200,200)到(154,154),可以通过对每个Conv2D层进行padding ='same'来轻松解决,如下所示:
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,3),如下所示:
更改:
autoencoder.add(Conv2D(1, (3, 3), padding='same'))
收件人:
autoencoder.add(Conv2D(3, (3, 3), padding='same'))