python - 深度卷积神经网络架构最终会产生错误。为什么?
问题描述
我建立了一个深度卷积神经网络,但我在某个地方搞砸了。我的输出尺寸有点偏,我不知道为什么。
encoding_dim = 512
input_image = Input(shape=train_images.shape[1:]) # (214, 214, 3)
# Build model
autoencoder = Sequential()
autoencoder.add(Conv2D(2*encoding_dim, (12, 12), padding='same', activation='relu', input_shape=input_shape,
kernel_initializer='random_uniform', bias_initializer='zeros'))
autoencoder.add(BatchNormalization())
autoencoder.add(MaxPooling2D((2, 2), padding='same'))
autoencoder.add(Conv2D(encoding_dim, (12, 12), padding='same', activation='relu',
kernel_initializer='random_uniform', bias_initializer='zeros'))
autoencoder.add(BatchNormalization())
autoencoder.add(MaxPooling2D((2, 2), padding='same'))
autoencoder.add(Conv2D(encoding_dim, (12, 12), padding='same', activation='relu',
kernel_initializer='random_uniform', bias_initializer='zeros'))
autoencoder.add(BatchNormalization())
autoencoder.add(UpSampling2D((2, 2)))
autoencoder.add(Conv2D(2*encoding_dim, (12, 12), padding='same', activation='relu',
kernel_initializer='random_uniform', bias_initializer='zeros'))
autoencoder.add(BatchNormalization())
autoencoder.add(UpSampling2D((2, 2)))
autoencoder.add(Conv2D(3, (12, 12), padding='same', activation='sigmoid',
kernel_initializer='random_uniform', bias_initializer='zeros'))
autoencoder.add(BatchNormalization())
# Compile
autoencoder.compile(optimizer='adam', loss='mean_squared_error')
我得到的错误是:
ValueError: Error when checking target: expected batch_normalization_5 to have shape (216, 216, 3) but got array with shape (214, 214, 3)
解决方案
好的,想通了。基本上,我选择的图像尺寸很差。图像尺寸为 214 x 214 x 3,导致我的下采样(MaxPooling2D 层)必须舍入尺寸(214 -> 107 -> 54)。UpSampling 没有这个问题,所以最后没有加起来。