Python ValueError:检查目标时出错:预期激活_7具有形状(154,154,1),但获得具有形状(200,200,3)的数组

Python ValueError:检查目标时出错:预期激活_7具有形状(154,154,1),但获得具有形状(200,200,3)的数组,python,machine-learning,keras,neural-network,conv-neural-network,Python,Machine Learning,Keras,Neural Network,Conv Neural Network,我正在尝试建立CNN自动编码器。每个训练图像(颜色)的大小为200*200。编译时出现错误:ValueError:检查目标时出错:预期激活\u 7具有形状(154,154,1),但获得具有形状(200,200,3)的数组,代码如下。如何修改代码才能正常工作 autoencoder = Sequential() autoencoder.add(Conv2D(64, (3, 3), input_shape=(200, 200, 3))) autoencoder.add(Activation('re

我正在尝试建立CNN自动编码器。每个训练图像(颜色)的大小为200*200。编译时出现错误:
ValueError:检查目标时出错:预期激活\u 7具有形状(154,154,1),但获得具有形状(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')

在我看来,上面的代码有两个主要问题

首先是尺寸减小,从(200200)到(154154),这可以通过向每个Conv2D层填充class='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')
第二个问题是你的目标。在您的最后一个
Conv2D
层中,您试图通过输出
(200200,1)
预测的是
sigmoid激活
binary\u交叉熵损失
的灰度图像。如果这是您想要的,您必须使用y_train作为1通道图像(200200,1)来训练您的模型,否则您可以将输出更改为(200200,3),如下所示:

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')
更改:

autoencoder.add(Conv2D(1, (3, 3), padding='same'))
致:


此错误何时发生?网络编译得很好。你能提供输入和输出的大小吗?你如何训练它?你看到你的目标不是相同形状的输入吗?我想用一组大小为200*200的彩色图像进行训练,并想预测相同大小的彩色图像。我也不知道在上面的代码中输入的形状是如何从上到下流动的。添加autoencoder.summary()在代码末尾(如果在jupyter中,则在后面),您将看到每一层后的大小,您可能需要检查它们。谢谢,它解决了我的问题。在输出层中可以进一步更改哪些内容,以使输出图像成为每个通道值在[0-255]之间的彩色图像?