首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >loss.backward()和optimizer.step()在批处理规范层的eval模式下?

loss.backward()和optimizer.step()在批处理规范层的eval模式下?
EN

Stack Overflow用户
提问于 2019-08-02 08:53:44
回答 1查看 2.7K关注 0票数 3

我有一个ResNet-8网络,用于一个基于图像域适配项目,基本上,我已经在dataset上对网络进行了培训,现在我想在另一个模拟实时环境的数据集上评估它,在这个环境中,我尝试一次预测一幅图像,但下面是有趣的部分:

我想对目标数据集进行评估的方法是,对每幅图像执行一次列车模式的前向传递,以便更新批处理范数层统计信息(使用torch.no_grad(),因为我当时不想更新网络参数,而只是“适应”批处理范数层),然后在eval模式下进行另一次前向传递,以获得实际的预测,这样批处理规范层将根据迄今所看到的整组图像使用均值和方差(而不仅仅是该批的图像,在这种情况下是单个图像):

代码语言:javascript
复制
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%的准确率:

代码语言:javascript
复制
loss.backward()
optimizer.step()

因此,我的问题是,如果在模式下执行向后()和步骤()会发生什么?因为我知道批处理规范和丢弃层的不同行为,我知道torch.no_grad()和梯度是如何计算的,然后参数是如何由优化器更新的,但是我无法找到关于我的具体问题的任何信息。

我认为,既然模型是在eval模式下设置的,那么这两条线应该是无用的,但是确实发生了一些事情,这与批处理范数层的仿射参数有关吗?

UPDATE:好的,我误解了: eval模式不会阻止要更新的参数,它只会改变一些层的行为(批处理规范和退出),对吗?因此,有了这两条线,我实际上是在训练网络,从而提高了准确性。无论如何,如果批处理范数仿射设置为真,这会改变什么吗?这些参数被认为是在optimizer.step()期间更新的“正常”参数,还是不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-05 17:47:59

eval模式不会阻止要更新的参数,它只会改变一些层的行为(批处理规范和退出),对吗?

是真的。

因此,有了这两条线,我实际上是在训练网络,从而提高了准确性。无论如何,如果批处理范数仿射设置为真,这会改变什么吗?这些参数被认为是在optimizer.step()期间更新的“正常”参数,还是不同?

BN参数在优化器步骤中被更新。看:

代码语言:javascript
复制
    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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57323023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档