首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在恢复训练时保存和加载回调?

如何在恢复训练时保存和加载回调?
EN

Stack Overflow用户
提问于 2020-07-08 02:18:09
回答 1查看 191关注 0票数 0

目前,我正在使用Keras中的回调来根据最低的验证损失对模型进行检查点。由于该模型每个时期需要5-6小时的训练,因此我在Google Colab断开连接之前完成了大约2个时期。因此,每次它断开连接时,我都会从最后一个检查点恢复训练。

到目前为止,我正在使用model.save和model.load来保留有关回调、权重和训练配置的所有信息。

第一次训练模型:

代码语言:javascript
运行
复制
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)

对于恢复训练:

代码语言:javascript
运行
复制
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都被设置回无穷大。因此,最新的纪元将覆盖以前保存的纪元。有没有办法保存验证损失的监控值?

EN

回答 1

Stack Overflow用户

发布于 2020-08-06 22:42:30

我有同样的情况,在第一次恢复时期后,模型被保存,只是因为val_loss是从inf改进的,而不考虑加载的模型的实际损失。

我的网络速度很慢,而且我在大学HPC上的访问时间有限,所以这很令人沮丧,因为每次我恢复训练时,最初的几个时代都会丢失,无法将网络恢复到原来的val_loss。

但我想我知道问题出在哪里了。问题在文件中的第360行:

  • /home/usr/python/anaconda/lib/python3.7/site-packages/keras/callbacks.py

在ModelCheckpoint中,变量self.best是先前保存的最佳模型的损失值。将此量与指定时期结束时的当前val_loss (varibale current in on_epoch_end,第424行)进行比较,并在此基础上保存具有较低损耗(或更高精度)的模型。

当从begin 开始时,self.best被初始化为Inf (正数或负数取决于您使用的是损失还是精度),但在恢复的情况下,应将其重置为一个值。这是因为标准ModelCheckpoint没有关于它是恢复训练的信息,所以它将恢复训练视为新的训练。

作为一种快速修复方法,我修改了ModelCheckpoint,以便可以实际传递变量best,该变量对应于保存的模型的损失(如果未指定,则为Inf )加上一些细微的更改。这样:

代码语言:javascript
运行
复制
    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

我希望这能对你有所帮助。干杯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62781555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档