当前位置: 首页 > 知识库问答 >
问题:

pytorch-损失。backward()和优化器。是否在评估模式下使用batch Normal图层执行步骤()?

屈升
2023-03-14

我有一个ResNet-8网络,我正在用于图像上的域适应项目,基本上我已经在数据集上训练了网络,现在我想在另一个模拟实时环境的数据集上评估它,我试图一次预测一个图像,但有趣的部分来了:

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

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()

因此,我的问题是,如果在eval模式下执行backward()和step(),会发生什么?因为我知道train和eval模式之间批次规范和退出层的不同行为,我也知道torch。no\u grad()以及如何计算梯度,然后由优化器更新参数,但我无法找到有关我的特定问题的任何信息。

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

更新:好吧,我误解了一些事情:评估模式不会阻止要更新的参数,它只会改变某些层(批处理范数和dropout)在向前传递期间的行为,对吗?因此,对于这两条线,我实际上是在训练网络,因此精度更高。无论如何,如果批处理范数仿射设置为真,这会改变什么吗?这些参数被认为是optimizer.step()期间要更新的“正常”参数还是不同?

共有1个答案

何正德
2023-03-14

评估模式不会阻止要更新的参数,它只会在向前传球过程中改变某些层的行为(批次标准和退出),对吗?

真实。

因此,对于这两行,我实际上是在训练网络,因此精度更高。无论如何,如果批处理范数仿射设置为真,这会改变什么吗?这些参数被认为是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)
 类似资料:
  • 我每一步都能得到训练损失。但我确实想在tensorboard中的图'lossxx'中添加评估损失。怎么做?

  • 我想在每个n批次之后输出它,而不是在每个纪元打印评估损失。 我每个时代大约有15万批。我想每50000批输出一次评估损失。 这可能吗?我正在使用pytorch和huggingface的预训练bert模型。 我的列车循环:

  • 我相信C#一旦能够判断结果,就会停止评估if语句条件。例如: 由于条件

  • 我是pytorch的新手,我正在尝试运行我找到的github模型并对其进行测试。因此,作者提供了模型和损失函数。 像这样: 数据加载 假设我想训练这个模型15个时代。这就是我到目前为止所做的:我正在尝试设置优化器和训练,但我不确定如何将自定义丢失和数据加载绑定到模型,并正确设置15个历元训练。 有什么建议吗?

  • 我是Apache Flink的新手,我正在尝试使用Flink CEP动态评估流中的模式。我正在尝试查找执行以下操作的用户登录、addtocart和注销,并且能够检测到模式,但是如果我定义了多个模式,例如登录,注销,则无法检测到模式 下面是我的代码 动作类 模式类 主类 如果我给出一个模式来评估它的输出,如下所示 如果我试图给多个模式进行评估,如下面所示,它不是评估第二个模式,而是建议我如何评估多个

  • 嗨,我正在尝试创建一个VariationalDenseLayer,其中KL损失在调用函数中计算。 然而,当我试图将我的最终损失定义为neg_log_likelihhoodkl_loss时,我得到了以下错误: TypeError:函数构建代码之外的op被传递一个“图形”张量。通过包含tf,可以使图张量从函数构建上下文中泄漏出来。函数构建代码中的init_范围。例如,以下函数将失败:@tf。函数def