目前,我正在使用Keras中的回调来根据最低的验证损失对模型进行检查点。由于该模型每个时期需要5-6小时的训练,因此我在Google Colab断开连接之前完成了大约2个时期。因此,每次它断开连接时,我都会从最后一个检查点恢复训练。
到目前为止,我正在使用model.save和model.load来保留有关回调、权重和训练配置的所有信息。
第一次训练模型:
checkpoint = ModelCheckpoint(classifier,
monitor="val_loss",
mode="min",
save_best_only = True,
verbose=1)
earlystop = EarlyStopping(monitor = 'val_loss',
min_delta = 0,
patience = 20,
verbose = 1,
restore_best_weights = True)
reduce_lr = ReduceLROnPlateau(monitor = 'val_loss',
factor = 0.2,
patience = 10,
verbose = 1,
min_delta = 0.00001)
callbacks = [earlystop, checkpoint, reduce_lr]
model.compile(loss = 'categorical_crossentropy',
optimizer = Adam(lr=0.0001),
metrics = ['accuracy'])
history = model.fit_generator(
train_generator,
steps_per_epoch = train_generator.samples // batch_size,
epochs = epochs,
callbacks = callbacks,
validation_data = validation_generator,
validation_steps = validation_generator.samples // batch_size)
对于恢复训练:
model = load_model(classifier)
history = model.fit_generator(
train_generator,
steps_per_epoch = train_generator.samples // batch_size,
epochs = epochs,
callbacks = callbacks,
validation_data = validation_generator,
validation_steps = validation_generator.samples // batch_size)
但是,每次我恢复训练时,val_loss都被设置回无穷大。因此,最新的纪元将覆盖以前保存的纪元。有没有办法保存验证损失的监控值?
发布于 2020-08-06 22:42:30
我有同样的情况,在第一次恢复时期后,模型被保存,只是因为val_loss是从inf改进的,而不考虑加载的模型的实际损失。
我的网络速度很慢,而且我在大学HPC上的访问时间有限,所以这很令人沮丧,因为每次我恢复训练时,最初的几个时代都会丢失,无法将网络恢复到原来的val_loss。
但我想我知道问题出在哪里了。问题在文件中的第360行:
在ModelCheckpoint中,变量self.best是先前保存的最佳模型的损失值。将此量与指定时期结束时的当前val_loss (varibale current in on_epoch_end,第424行)进行比较,并在此基础上保存具有较低损耗(或更高精度)的模型。
当从begin 开始时,self.best被初始化为Inf (正数或负数取决于您使用的是损失还是精度),但在恢复的情况下,应将其重置为一个值。这是因为标准ModelCheckpoint没有关于它是恢复训练的信息,所以它将恢复训练视为新的训练。
作为一种快速修复方法,我修改了ModelCheckpoint,以便可以实际传递变量best,该变量对应于保存的模型的损失(如果未指定,则为Inf )加上一些细微的更改。这样:
resume_loss, _ = model.evaluate(X_valid, y_valid, verbose=1)
SaveModelCheckpoint(..., best=resume_loss)
下面是我的自定义ModelCheckpoint:
https://github.com/micbia/SegU-Net/blob/master/utils_network/callbacks.py#L141
我希望这能对你有所帮助。干杯
https://stackoverflow.com/questions/62781555
复制相似问题