如何将代码分成 pytorch cnn 的 train、val 和 test 函数?

How to seperate code into train, val and test functions for pytorch cnn?

我正在使用 pytorch 训练 cnn 并创建了一个训练循环。当我执行优化和试验超参数调整时,我想将我的训练、验证和测试分成不同的函数。我需要能够记录每个函数的准确性和损失,以便绘制图表。为此,我想创建一个 returns 精度的函数。

我对编码还很陌生,想知道解决这个问题的最佳方法。我觉得我的代码现在有点乱。我需要能够输入各种超参数以在我的训练函数中进行实验。谁能提供任何建议?以下是我目前所能做的:

def train_model(model, optimizer, data_loader,  num_epochs, criterion=criterion):
  total_epochs = notebook.tqdm(range(num_epochs))

  for epoch in total_epochs:
    model.train()

    train_correct = 0.0
    train_running_loss=0.0
    train_total=0.0

    for i, (img, label) in enumerate(data_loader['train']):
      #uploading images and labels to GPU
      img = img.to(device)
      label = label.to(device)

      #training model
      outputs = model(img)

      #computing losss
      loss = criterion(outputs, label)

      #propagating the loss backwards
      optimizer.zero_grad()
      loss.backward()
      optimizer.step()

      train_running_loss += loss.item()
    
      _, predicted = outputs.max(1)
      train_total += label.size(0)
      train_correct += predicted.eq(label).sum().item()
      
    train_loss=train_running_loss/len(data_loader['train'])
    train_accu=100.*correct/total

    print('Train Loss: %.3f | Train Accuracy: %.3f'%(train_loss,train_accu))

我也尝试过制作一个函数来记录准确度:

def accuracy(outputs, labels):
    _, preds = torch.max(outputs, dim = 1)
    return torch.tensor(torch.sum(preds == labels).item() / len(preds))

首先,请注意:

  • 除非您有某些特定的动机,否则应该在与训练集不同的数据集上执行验证(和测试),因此您应该使用不同的 DataLoader。由于每个 epoch 都有一个额外的 for 循环,因此计算时间会增加。
  • 总是在 validation/testing 之前调用 model.eval()

也就是说,验证函数的签名与 train_model

的签名非常相似
# criterion is passed if you want to register the validation loss too
def validate_model(model, eval_loader, criterion):
   ...

然后,在train_model中,在每个纪元之后,您可以调用函数validate_model并将返回的指标存储在某个数据结构中(listtensor,等),稍后将用于绘图。

训练结束后,您可以使用相同的validate_model函数进行测试。

您可以使用 TorchMetrics

中的 Accuracy 而不是自己编码准确性

最后,如果你觉得需要升级,可以使用像PyTorch Lightning or FastAI. Give also a look at some hyperparameter tuning library such as Ray Tune这样的深度学习训练框架。