我正在尝试按照https://www.tensorflow.org/tutorials/images/transfer_learning#create_the_base_model_from_the_pre-trained_convnets中描述的微调步骤,以获取用于二进制分割的训练模型。
我创建了一个编码器-解码器,其中编码器的权重是MobileNetV2的权重,并固定为
我会尽力为您翻译。这段内容的意思是:“我存储了这个模型的所有权重,然后按以下步骤进行微调:”。
突然间我的模型表现比解码器训练期间要差得多:
我创建了一个编码器-解码器,其中编码器的权重是MobileNetV2的权重,并固定为
encoder.trainable = False
。然后,我按照教程中所述定义我的解码器,并使用学习率为0.005训练网络300个时期。在最后几个时期中,我获得了以下损失值和Jaccard指数:Epoch 297/300
55/55 [==============================] - 85s 2s/step - loss: 0.2443 - jaccard_sparse3D: 0.5556 - accuracy: 0.9923 - val_loss: 0.0440 - val_jaccard_sparse3D: 0.3172 - val_accuracy: 0.9768
Epoch 298/300
55/55 [==============================] - 75s 1s/step - loss: 0.2437 - jaccard_sparse3D: 0.5190 - accuracy: 0.9932 - val_loss: 0.0422 - val_jaccard_sparse3D: 0.3281 - val_accuracy: 0.9776
Epoch 299/300
55/55 [==============================] - 78s 1s/step - loss: 0.2465 - jaccard_sparse3D: 0.4557 - accuracy: 0.9936 - val_loss: 0.0431 - val_jaccard_sparse3D: 0.3327 - val_accuracy: 0.9769
Epoch 300/300
55/55 [==============================] - 85s 2s/step - loss: 0.2467 - jaccard_sparse3D: 0.5030 - accuracy: 0.9923 - val_loss: 0.0463 - val_jaccard_sparse3D: 0.3315 - val_accuracy: 0.9740
我会尽力为您翻译。这段内容的意思是:“我存储了这个模型的所有权重,然后按以下步骤进行微调:”。
model.load_weights('my_pretrained_weights.h5')
model.trainable = True
model.compile(optimizer=Adam(learning_rate=0.00001, name='adam'),
loss=SparseCategoricalCrossentropy(from_logits=True),
metrics=[jaccard, "accuracy"])
model.fit(training_generator, validation_data=(val_x, val_y), epochs=5,
validation_batch_size=2, callbacks=callbacks)
突然间我的模型表现比解码器训练期间要差得多:
Epoch 1/5
55/55 [==============================] - 89s 2s/step - loss: 0.2417 - jaccard_sparse3D: 0.0843 - accuracy: 0.9946 - val_loss: 0.0079 - val_jaccard_sparse3D: 0.0312 - val_accuracy: 0.9992
Epoch 2/5
55/55 [==============================] - 90s 2s/step - loss: 0.1920 - jaccard_sparse3D: 0.1179 - accuracy: 0.9927 - val_loss: 0.0138 - val_jaccard_sparse3D: 7.1138e-05 - val_accuracy: 0.9998
Epoch 3/5
55/55 [==============================] - 95s 2s/step - loss: 0.2173 - jaccard_sparse3D: 0.1227 - accuracy: 0.9932 - val_loss: 0.0171 - val_jaccard_sparse3D: 0.0000e+00 - val_accuracy: 0.9999
Epoch 4/5
55/55 [==============================] - 94s 2s/step - loss: 0.2428 - jaccard_sparse3D: 0.1319 - accuracy: 0.9927 - val_loss: 0.0190 - val_jaccard_sparse3D: 0.0000e+00 - val_accuracy: 1.0000
Epoch 5/5
55/55 [==============================] - 97s 2s/step - loss: 0.1920 - jaccard_sparse3D: 0.1107 - accuracy: 0.9926 - val_loss: 0.0215 - val_jaccard_sparse3D: 0.0000e+00 - val_accuracy: 1.0000
这种情况是否有已知的原因?这是正常现象吗? 非常感谢您的提前帮助!
model.trainable=True
就不会起作用。我进行了实验验证,并且在 https://www.tensorflow.org/tutorials/images/transfer_learning#un-freeze_the_top_layers_of_the_model 中也有说明:“您应该重新编译模型(必须进行这些更改才能生效)。”编译模型还允许我更改学习率等参数。另一个问题是,在执行model.trainable=True
之前应该先加载权重,因为它们来自于一些被冻结的层的模型。 - eLearner