【问题标题】:Evaluate the model during training affects its performance PyTorch在训练期间评估模型会影响其性能 PyTorch
【发布时间】:2021-08-11 06:11:01
【问题描述】:

PyTorch 中,我想在训练期间每隔eval_step 在验证集上评估我的模型,我编写了这样的代码:

def tune(model, loader_train, loader_dev, optimizer, epochs, eval_step):
    for epoch in range(epochs):
        for step,x in enumerate(loader_train):
            optimizer.zero_grad()
            loss = model(x)
            loss.backward()
            optimizer.step()
            
            if step % eval_step == 0:
                model.eval()
                test(model, loader_dev)
                model.train()

eval_step = int(len(loader_train)/2)eval_step = int(len(loader_train)/8) 时,在整个 epoch 训练后会导致完全不同的度量结果(这意味着前者的第二个输出与后者的第八个输出不同)。

谁能解释一下原因?


loader_train 的长度为 20000(取决于批量大小),这是我的测试脚本:

def test(model, loader_dev):
    preds = []
    labels = []
    for step,x in enumerate(loader_dev):
        preds.append(model(x).view(-1))
        labels.apend(x['label'].view(-1))

    metric = cal_metric(preds, labels)
    logger.info(metric)

【问题讨论】:

  • 你还没有给出很多:loader_train 的长度是多少?您是否检查了两个实验中对应的步骤编号? test是如何实现的?
  • 如果您的模型经常振荡,那么您可能需要考虑降低学习率(或使用 LR 调度程序)。但正如@Ivan 指出的那样,正确分析问题需要更多细节。
  • @Ivan,@akshayk07,我添加了我的测试脚本(简化),我保证我的cal_metric 函数没有任何问题。

标签: python pytorch


【解决方案1】:

我认为您可能在数据加载器中设置了“shffule=True”。即使您修复了“随机种子”,如果您在使用当前数据加载器时使用另一个数据加载器,torch 中的数据加载器也会产生不同的结果。在您描述的场景中,可能会导致您的模型以不同的顺序获取数据输入,从而导致不同的度量结果。

【讨论】:

  • 即使使用shuffle=True 和固定种子,您得到相同的随机序列。
  • 如果训练集使用'shuffle=true',验证集使用'shuffle=False',那么使用'training set->validation set->training set->validation set'的结果会不同来自“训练集->训练集->验证集”的结果。
猜你喜欢
  • 2021-12-22
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2022-12-23
  • 1970-01-01
  • 2016-10-19
  • 2021-03-28
相关资源
最近更新 更多