【发布时间】: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函数没有任何问题。