我有一个ResNet-8网络,用于一个基于图像的域适配项目,基本上,我已经在dataset上对网络进行了培训,现在我想在另一个模拟实时环境的数据集上评估它,在这个环境中,我尝试一次预测一幅图像,但下面是有趣的部分:
我想对目标数据集进行评估的方法是,对每幅图像执行一次列车模式的前向传递,以便更新批处理范数层统计信息(使用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()因此,我的问题是,如果在模式下执行向后()和步骤()会发生什么?因为我知道批处理规范和丢弃层的不同行为,我知道torch.no_grad()和梯度是如何计算的,然后参数是如何由优化器更新的,但是我无法找到关于我的具体问题的任何信息。
我认为,既然模型是在eval模式下设置的,那么这两条线应该是无用的,但是确实发生了一些事情,这与批处理范数层的仿射参数有关吗?
UPDATE:好的,我误解了: eval模式不会阻止要更新的参数,它只会改变一些层的行为(批处理规范和退出),对吗?因此,有了这两条线,我实际上是在训练网络,从而提高了准确性。无论如何,如果批处理范数仿射设置为真,这会改变什么吗?这些参数被认为是在optimizer.step()期间更新的“正常”参数,还是不同?
发布于 2019-08-05 17:47:59
eval模式不会阻止要更新的参数,它只会改变一些层的行为(批处理规范和退出),对吗?
是真的。
因此,有了这两条线,我实际上是在训练网络,从而提高了准确性。无论如何,如果批处理范数仿射设置为真,这会改变什么吗?这些参数被认为是在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)https://stackoverflow.com/questions/57323023
复制相似问题