【问题标题】:ValueError: Error when checking target: expected activation_7 to have shape (154, 154, 1) but got array with shape (200, 200, 3)ValueError:检查目标时出错:预期 activation_7 的形状为 (154, 154, 1) 但得到的数组的形状为 (200, 200, 3)
【发布时间】:2019-06-25 13:46:24
【问题描述】:

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

【问题讨论】:

  • 这个错误什么时候出现?网络编译得很好。你能提供输入和输出的大小吗?你怎么训练它?你有没有看到你的目标与输入的形状不同?
  • 我想用一组尺寸为 200*200 的彩色图像进行训练,并想预测相同尺寸的彩色图像。我也不知道在上面的代码中输入的形状是如何从上到下流动的。
  • 在代码末尾(或者在jupyter之后)添加autoencoder.summary(),你会看到每一层之后的大小,你可能想检查一下。

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


【解决方案1】:

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

首先是维度减少,从 (200,200) 到 (154,154) 女巫可以通过 padding='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')

第二个问题是你的目标。您在此处尝试使用最后一个Conv2D 层的输出(200,200,1) 预测的内容,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'))

【讨论】:

  • 谢谢,它解决了我的问题。在输出层中可以进一步改变什么,使输出图像是彩色图像,每个通道值在 [0-255] 之间?
猜你喜欢
  • 2018-10-24
  • 2019-01-10
  • 2021-06-30
  • 2023-03-25
  • 2018-12-31
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多