我正在尝试使用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毫秒的损失。以下是一些重构的示例:它不是最好的自动编码器,但问题出在其他地方。
我还对“ 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)
我想我连接两个网络都存在根本性的错误。
我还使用SGD优化器对网络进行了100个时期的培训
optimizer = tf.keras.optimizers.SGD(learning_rate=0.0002, momentum=0.9, nesterov=False)
train_accuracy改善到99%,但是val_accuracy停留在47%,重建的图像看起来像这样: