我正在编写一个在CIFAR10数据集上运行自编码器并查看重建图像的代码。
要求是创建
编码器的第一层
- 输入形状:(32,32,3)
- 包含64个(3,3)滤波器的Conv2D层
- 批量归一化层
- ReLu激活
- 包含(2,2)滤波器的2D最大池化层
编码器的第二层
- 包含16个(3,3)滤波器的Conv2D层
- 批量归一化层
- ReLu激活
- 包含(2,2)滤波器的2D最大池化层
- 最终编码为使用(2,2)的最大池化层,结合所有前面的层
解码器的第一层
- 输入形状:编码器输出
- 包含16个(3,3)滤波器的Conv2D层
- 批量归一化层
- ReLu激活
- 包含(2,2)滤波器的UpSampling2D
解码器的第二层
- 包含32个(3,3)滤波器的Conv2D层
- 批量归一化层
- ReLu激活
- 包含(2,2)滤波器的UpSampling2D
- 最终解码为使用Sigmoid激活,结合所有前面的层
我明白
- 当我们创建卷积自编码器(或任何自编码器)时,我们需要将前一层的输出传递给下一层。
- 所以,当我创建第一个Conv2D层并使用ReLu激活,然后执行批量归一化时…我传递的是Conv2D层的输出,对吗?
- 但是当我进行MaxPooling2D时…我应该传递什么…批量归一化的输出还是Conv2D层的输出?
另外,这些操作的执行顺序有规定吗?
- Conv2D –> 批量归一化 –> MaxPooling2D
- 或者
- Conv2D –> MaxPooling2D –> 批量归一化
我附上我的代码如下…我尝试了两种不同的方法,因此得到了不同的输出(在模型摘要和模型训练图表方面)
请问有人能通过解释哪种方法是正确的(方法1还是方法2)来帮助我吗?另外,我如何理解哪个图表显示了更好的模型性能?
方法 – 1
input_image = Input(shape=(32, 32, 3))### Encoderconv1_1 = Conv2D(64, (3, 3), activation='relu', padding='same')(input_image)bnorm1_1 = BatchNormalization()(conv1_1)mpool1_1 = MaxPooling2D((2, 2), padding='same')(conv1_1)conv1_2 = Conv2D(16, (3, 3), activation='relu', padding='same')(mpool1_1)borm1_2 = BatchNormalization()(conv1_2)encoder = MaxPooling2D((2, 2), padding='same')(conv1_2)### Decoderconv2_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(encoder)bnorm2_1 = BatchNormalization()(conv2_1)up1_1 = UpSampling2D((2, 2))(conv2_1)conv2_2 = Conv2D(32, (3, 3), activation='relu', padding='same')(up1_1)bnorm2_2 = BatchNormalization()(conv2_2)up2_1 = UpSampling2D((2, 2))(conv2_2)decoder = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(up2_1)model = Model(input_image, decoder)model.compile(optimizer='adam', loss='binary_crossentropy')model.summary()history = model.fit(trainX, trainX, epochs=50, batch_size=1000, shuffle=True, verbose=2, validation_data=(testX, testX) )
作为模型摘要的输出,我得到以下内容
总参数:18,851
可训练参数:18,851
不可训练参数:0
plt.plot(history.history['loss'])plt.plot(history.history['val_loss'])plt.title('模型损失')plt.ylabel('损失')plt.xlabel('epoch')plt.legend(['训练', '测试'], loc='upper right')plt.show()
方法 – 2
input_image = Input(shape=(32, 32, 3))### Encoderx = Conv2D(64, (3, 3), activation='relu', padding='same')(input_image)x = BatchNormalization()(x)x = MaxPooling2D((2, 2), padding='same')(x)x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)x = BatchNormalization()(x)encoder = MaxPooling2D((2, 2), padding='same')(x)### Decoderx = Conv2D(16, (3, 3), activation='relu', padding='same')(encoder)x = BatchNormalization()(x)x = UpSampling2D((2, 2))(x)x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)x = BatchNormalization()(x)x = UpSampling2D((2, 2))(x)decoder = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)model = Model(input_image, decoder)model.compile(optimizer='adam', loss='binary_crossentropy')model.summary()history = model.fit(trainX, trainX, epochs=50, batch_size=1000, shuffle=True, verbose=2, validation_data=(testX, testX) )
作为模型摘要的输出,我得到以下内容
总参数:19,363
可训练参数:19,107
不可训练参数:256
plt.plot(history.history['loss'])plt.plot(history.history['val_loss'])plt.title('模型损失')plt.ylabel('损失')plt.xlabel('epoch')plt.legend(['训练', '测试'], loc='upper right')plt.show()
回答: