连接自动编码器和CNN

时间:2020-03-03 10:53:37

标签: python tensorflow machine-learning keras autoencoder

我正在尝试使用keras重新创建this paper

基本思想是:

  • 分别预训练自动编码器和分类器网络
  • 冻结编码器和分类器网络的权重
  • 结合两个网络,对解码器进行微调,并查看网络如何为分类器解码图像

自动编码器和分类器网络本身可以正常工作,但是当我连接它们并让解码器训练一些奇怪的事情时,就会发生这种情况。

这是我的自动编码器

    def create_autoencoder(self, filters=[20, 40, 80, 160, 320], kernel=(3,3), stride=(1,1), strideundo=2, pool=(2,2)):
        # define encoder architecture
        self.encoder = tf.keras.models.Sequential()
        self.encoder.add(tf.keras.layers.InputLayer(self.input_shape))
        for i in range(len(filters)):
            self.encoder.add(tf.keras.layers.Conv2D(filters=filters[i], kernel_size=kernel, strides=stride, activation='elu', padding='same'))
            self.encoder.add(tf.keras.layers.MaxPooling2D(pool_size=pool))
            #self.encoder.add(tf.keras.layers.AveragePooling2D(pool_size=pool))

        # define decoder architecture
        self.decoder = tf.keras.models.Sequential()
        for i in range(1,len(filters)):
            self.decoder.add(tf.keras.layers.Conv2DTranspose(filters=filters[len(filters)-i], kernel_size=kernel, strides=strideundo, activation='elu', padding='same'))
        self.decoder.add(    tf.keras.layers.Conv2DTranspose(filters=self.input_shape[2],kernel_size=kernel, strides=strideundo, activation='sigmoid',  padding='same'))

        # compile model
        input         = tf.keras.layers.Input(self.input_shape)
        code          = self.encoder(input)
        reconstructed = self.decoder(code)

        self.model = tf.keras.models.Model(inputs=input, outputs=reconstructed)

在'cats_vs_dogs'数据集上经过100个纪元后,我将损失大约0.005毫秒的损失。以下是一些重构的示例:Reconstructed images它不是最好的自动编码器,但问题出在其他地方。

我还对“ cats_vs_dogs”数据集中的预训练MobileNetV2进行了微调,并获得了约98%的准确性。就像在这个tutorial 中一样。

保存和恢复两个模型的高度/模型都很好。可以说我这样还原/创建它们。

autoencoder = create_autoencoder()
autoencoder.model.load_weights("/weights/cae_weight.hdf5")
mobileNet2 = load_model("/weights/checkpoint_mobileNet/mobileNetV2_finetuned.h5")

并且只允许解码器可训练

autoencoder.encoder.trainable = False
mobileNet2.trainable = False
autoencoder.decoder.trainable = True

连接两个模型

combinedModels = tf.keras.Sequential([autoencoder.model, mobileNet2])

我编译连接的模型

combinedModels.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.0002,momentum=0.9,nesterov=False),
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])

训练他们

history = combinedModels.fit(train_batches, epochs=1, validation_data=validation_batches, validation_steps=20, shuffle=True)

经过5个训练步骤,重建的图像如下所示: reconstructed images after 5 training steps

1个时期后,图像如下所示: reconstructed images after 1 epoch

我想我连接两个网络都存在根本性的错误。

我还使用SGD优化器对网络进行了100个时期的培训

optimizer = tf.keras.optimizers.SGD(learning_rate=0.0002, momentum=0.9, nesterov=False)

train_accuracy改善到99%,但是val_accuracy停留在47%,重建的图像看起来像这样:

enter image description here

0 个答案:

没有答案
相关问题