In 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()
When eval_step = int(len(loader_train)/2)
and eval_step = int(len(loader_train)/8)
,它们导致完全不同的度量结果经过一整轮训练后(这意味着前者的第二个输出与后者的第八个输出不同)。
有人能解释一下为什么吗?
长度为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)
我认为您可能在数据加载器中设置了“shffule=True”。即使您修复了“随机种子”,如果您在使用当前数据加载器时使用另一个数据加载器,torch 中的数据加载器也会生成不同的结果。在您描述的场景中,它可能会导致您的模型以不同的顺序获取数据输入,然后导致不同的指标结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)