ValueError:检查目标时出错:预期activation_7具有形状(154,154,1),但形状为(200,200,3)的数组

时间:2019-06-25 13:46:24

标签: python machine-learning keras neural-network conv-neural-network

我正在尝试构建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')

1 个答案:

答案 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 activationbinary_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'))