卷积自编码器

我正在编写一个在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激活,结合所有前面的层

我明白

  1. 当我们创建卷积自编码器(或任何自编码器)时,我们需要将前一层的输出传递给下一层。
  2. 所以,当我创建第一个Conv2D层并使用ReLu激活,然后执行批量归一化时…我传递的是Conv2D层的输出,对吗?
  3. 但是当我进行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()

模型损失图 - 1


方法 – 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()

模型损失图 - 2


回答:

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注