是否可以从神经网络模型中断的点开始执行?

Is it possible to execute from the point where the neural network model is interrupted?

假设我正在训练一个神经网络模型。我以 .pth 格式存储每 15 个时期的神经网络模型的张量文件。

我总共需要 运行 1000 个 epoch。假设我在第 501 个纪元停止了我的程序,那么我有以下文件

15.pth, 30.pth, 45.pth, 60.pth, 75.pth,.... 420.pth, 435.pth, 450.pth, 465.pth, 480.pth, 495.pth

那么我的疑惑是

是否可以使用最后存储的模型 495.pth 并继续执行,因为如果没有任何中断地完成通常会发生这种情况?简而言之,我要求对现有代码进行一些修改,类似于训练阶段的“恢复”。我就是求这样一种可能。

我要求的是一般做法,而不是特定于任何代码。如果存在这样的方法,我将可以自由地停止正在执行的任何程序,并可以稍后恢复。目前,如果正在执行较长的程序,我无法将资源用于较短的程序,因此我会问这个问题。

我为了从检查点恢复训练,你需要保存你训练过程的整个状态。这包括:

  1. 模型的当前权重。
  2. 优化器的状态:大多数优化器跟踪更新的不同统计数据,例如动量、方差等
  3. 学习率调度器的状态。
  4. 您的代码独有的其他“状态”变量。

如果您保存了所有这些信息,您应该能够完全恢复训练过程的“状态”并从那个点继续。

所以我所做的是: 在每个时期之后,我将我的模型权重保存到一个 .pt 文件中,并且每次我 运行 我的程序通常我检查 resume 参数是否设置为 True。如果是这样,我将使用 .pt 文件中的权重初始化模型,继续训练,否则我将正常初始化随机权重。这可能看起来像这样:

def train(resume: bool=False):
    model = Model()
    if resume:
        model.load_state_dict(torch.load("weights.pt"))
   
    criterion = Loss()
    optimizer = Optimizer()

    for epoch in range(100):
        for data, targets in dataloader:
            optimizer.zero_grad()

            predictions = model.train()(data)
            loss = criterion(predicitions, targets)

            loss.backward()
            optimizer.step()

        torch.save(model.state_dict(), "weights.pt")

所以如果我中断训练,我仍然可以在我保存的最后一个 epoch 之后继续。 通常,您记录的不仅仅是权重,例如学习率调度程序或简单的损失和准确性历史记录。为此,您可以将训练历史保存到 json 文件中,如果 resumeTrue.

则读取它