pytorch训练时连续两次eval会影响梯度下降?

我将训练和验证代码写成train和eval函数,然后在epoch循环中调用train和eval函数实现训练。但是我发现如果我一个epoch中按顺序调用train+eval和另一种train+eval+eval(只是单纯再调用一下),其结果竟然不一样。而且我的eval函数中确实启用了net.eval+no_grad(),按理说是不会影响梯度下降的,但是数据显示确实影响了梯度下降,请问有人能帮忙解下惑这是为什么吗?

img

for e in range(300):
    train_loss, train_acc = train(model, train_loader, loss_fn, optimizer, scaler, config, device)
    val_loss, val_acc = evaluate(model, val_loader, config, device)
    val_loss, val_acc = evaluate(model, val_loader, config, device)
    print(......)
    ......

试试多训练几次,然后看看每一次每一轮的train和eval的损失值是不是一样的?另外有没有设置随机种子了呢?

看看内部函数,有没有随机种子,以及no-grad的调用位置。eval只是停止了batch和dropout,如果no-grad的顺序不对也会引起梯度变化,还train的zerograd。总之检查与梯度相关的操作。