如果你玩过电子游戏,你就会明白为什么检查点(chekpoint)是有用的了。举个例子,有时候你会在一个大Boss的城堡前把你的游戏的当前进度保存起来——以防进入城堡里面就Game Over了。
机器学习和深度学习实验中的检查点本质上是一样的,它们都是一种保存你实验状态的方法,这样你就可以从你离开的地方开始继续学习。
如果你因为停电、操作系统故障、工作优先或其他类型的意外错误而丢失了一个或多个实验,你一定会抓狂。其他时候,即使你没有遇到不可预见的错误,你也可能只是想要恢复一种新实验的训练的特殊状态,或者从一个给定的状态中尝试不同的事情。
这就是为什么你需要检查点!
但是,等等,还有一个很重要的原因。如果你在工作结束时不检查你的训练模式,你将会失去所有的结果!简单来说,如果你想使用你训练的模型,你就需要一些检查点。
FloydHub是一个极其易用的深度学习云计算平台。号称“Zero Setup for Deep Learning”。它的服务主旨是: “您就专心研究您的深度学习,其它的环境配置、部署、版本控制等等都交给我们来做就可以了”。
这篇文章将演示如何在FloydHub上对你的训练模型进行检查,以便你可以从这些保存的状态重新开始你的实验。
什么是检查点?
Keras文档为检查点提供了一个很好的解释:
模型的体系结构,允许你重新创建模型
模型的权重
训练配置(损失、优化器、epochs和其他元信息)
优化器的状态,允许在你离开的地方恢复训练
同样,一个检查点包含了保存当前实验状态所需的信息,以便你可以从这一点恢复训练。
检查点策略
你可以根据你正在执行的训练类型,采用不同的检查点策略。
短期训练制度(几分钟到几小时)
正常的训练制度(数小时到一整天)
长期训练制度(数天至数周)
短期训练制度
典型的做法是在训练结束时,或者在每个epoch结束时,保存一个检查点。
正常的训练制度
在这种情况下,在每个n_epochs中保存多个检查点,并跟踪我们所关心的一些验证度量,这是很常见的。通常,有一个固定的最大数量的检查点,这样就不会占用太多的磁盘空间(例如,将你最大的检查点数量限制在10个,新的位置将会取代最早的检查点)。
长期训练制度
在这种类型的训练体系中,你可能希望采用与常规机制类似的策略:在每一个n_epochs中,你都可以节省多个检查点,并在你所关心的验证度量上保持最佳状态。在这种情况下,由于训练将花费很长的时间,所以减少检查点的次数是很常见的,但是需要维护更多的检查点。
哪种制度适合我?
这些不同策略之间的折衷是要保持频率和检查点文件的数量。让我们来看看当我们对这两个参数进行操作时发生了什么:
在FloydHub中保存和恢复
现在,让我们研究FloydHub上的一些代码。我将向你展示如何在TensorFlow、Keras和PyTorch这三个流行的深度学习框架中保存检查点:
在开始之前,使用floyd login命令登录到FloydHub命令行工具,然后复刻(fork)并初始化(init)项目:
$ git clone https://github.com/floydhub/save-and-resume.git
$ cd save-and-resume
$ floyd init save-and-resume
对于我们的检查点示例,我们将使用深度学习的Hello,World:使用卷积神经网络模型的MNIST分类任务。
因为预先清楚我们的检查点策略是很重要的,我将说明我们将要采用的方法:
只保留一个检查点
在每个epoch结束时采取策略
保存具有最佳(最大)验证精确度的那个
如果是这样的小例子,我们可以采用短期的训练制度。
命令
在深入研究具体的工作示例之前,让我们概述一下你需要的基本命令。当你开始新工作时,你的第一个命令看起来是这样的:
floyd run \