Pytorch 列车和评估模式中的反向传播

Pytorch 列车和评估模式中的反向传播,pytorch,backpropagation,Pytorch,Backpropagation,我正在尝试反向传播一个网络,用于定义如下的损耗函数: L=L_1+L_2。在这里,L_1是使用dropout和batchnorm层计算的,而L_2是在dropout和batchnorm设置为inactive的情况下计算的。要更新参数,必须求L_1和L_2的梯度之和。我已经编写了以下程序,但不知道如何检查正确性。任何帮助都将不胜感激 optimizer.zero_grad() net.train() ...# Calculation of L_1... L_1.backward() net.eva

我正在尝试反向传播一个网络,用于定义如下的损耗函数: L=L_1+L_2。在这里,L_1是使用dropout和batchnorm层计算的,而L_2是在dropout和batchnorm设置为inactive的情况下计算的。要更新参数,必须求L_1和L_2的梯度之和。我已经编写了以下程序,但不知道如何检查正确性。任何帮助都将不胜感激

optimizer.zero_grad()
net.train()
...# Calculation of L_1...
L_1.backward()
net.eval()
...# Calculation of L_2...
L_2.backward()
net.train()
optimizer.step()

我的理解是,
L_1.backward()
将针对所有参数(包括batchnorm)计算L_1的梯度,而
L_2.backward()
将仅针对参数计算梯度,并将其添加到原始梯度。最后,将网络设置为列车模式,然后执行
optimizer.step()
,更新所有参数(包括batchnorm)。

即使在评估模式下,批次norm参数alpha和gamma仍会更新梯度。Eval模式更改批处理规范的行为方式,运行的平均值和标准值不会得到更新。我不会称之为“非活动”,因为评估模式下的批处理规范不像辍学那样是一个传递层。非常感谢,我理解我的错误