我有一个 ResNet-8 网络,该网络用于图像上的 Domain Adaptation 项目,基本上我已经通过一个数据集,现在我想在另一个模拟实时环境的数据集上对它进行评估,我尝试一次预测一个图像,但这是有趣的部分:
我要对目标数据集进行评估的方法是对每张图像进行训练模式的前向通过,以便更新批处理规范层统计信息(使用torch.no_grad(),因为我不这样做)然后要更新网络参数,但只“适应”批范数层),然后以eval模式进行另一前向传递以获取实际预测,以便批范数层将使用基于整个集合的均值和方差到目前为止所看到的图像数量(不仅是该批次的图像,在本例中为单个图像):
optimizer.zero_grad()
model.train()
with torch.no_grad():
output_train = model(inputs)
model.eval()
output_eval = model(inputs)
loss = criterion(output_eval, targets)
我的想法是,我只是通过将批范数层更新为新的目标分布来进行域适应。
然后说完此步骤后,我的准确度为60%。 现在,如果我再加上另外两行,我就能达到80%的准确度:
loss.backward()
optimizer.step()
因此,我的问题是如果我在评估模式下执行back()和step()会发生什么情况?因为我知道训练模式和评估模式之间批处理规范层和退出层的不同行为,并且我知道torch.no_grad()以及如何计算梯度以及然后由优化程序更新参数的方法,但我无法找到任何信息关于我的具体问题。
我认为既然将模型设置为评估模式,那么这两行应该没用,但是显然会发生一些事情,这与批处理规范层的仿射参数有关吗?
更新:好的,我误解了一点:评估模式不会阻止要更新的参数,它只会更改前向传递过程中某些层(批处理规范和退出)的行为,对吗?因此,使用这两条线实际上是在训练网络,因此精度更高。无论如何,如果将批处理规范仿射设置为true,这会有所改变吗?这些参数是否被认为是在Optimizer.step()期间更新的“常规”参数?还是不同?
答案 0 :(得分:1)
eval模式不会阻止要更新的参数,它只会更改前向传递过程中某些层(批处理规范和退出)的行为,对吗?
是。
因此,使用这两行,我实际上是在训练网络,因此准确性更高。无论如何,如果将批处理规范仿射设置为true,这会有所改变吗?这些参数是否被认为是在Optimizer.step()期间更新的“常规”参数?还是不同?
BN参数在优化器步骤中更新。看:
if self.affine:
self.weight = Parameter(torch.Tensor(num_features))
self.bias = Parameter(torch.Tensor(num_features))
else:
self.register_parameter('weight', None)
self.register_parameter('bias', None)