请问模型在autograd.record下和模型不在autograd下进行前向计算有什么区别

如题,请问模型在autograd.record下和模型不在autograd下进行前向计算有什么区别?
我把一个模型放在autograd_record 下进行前向计算,和同样一个模型不再autograd下进行计算所得到的输出不一样,请问这是什么原因?

类似问题的代码:

 with autograd.record():
        out = model(shapes, labels, sample_prob)
         ...
        loss = ...
    loss.backward()

    optimizer.step(bsz)
    
    
    if epoch % (opt.info_interval*10) == 0:
        out2  = model(shapes, labels, sample_prob)

得出out 和out2 相差较大。
model 中有 lstm,Conv3D, batchnorm, Dense 这些种类的层,没有用Dropout

目前还没有找到好的方法,我只知道:在测试的时候,把测试的模型放在autograde.record() 或者 autograd.train_mode() 下,这样的出来的结果就是一样的了

类似问题的帖子:


希望会有所帮助

你放出来的代码里面,out2是网络更新参数之后计算出来的吧?所以和out的结果不一样

模型参数确实是更新过,再进行前向计算,但是当一个模型的loss不再有很大变化时,也就是说参数已经接近最优,在这种情况下out 和out2 的差别还是很大。
个人感觉是因为BatchNorm 层的存在导致了这种差异,因为在训练模式下,batchnorm层用的是local的mean和标准差来计算,而预测模式下,用的是global的mean和标准差,而再mxnet的block中,如果前向运算不在autograd下的话,默认是预测模式,所以会有此差异造成。