gpt4 book ai didi

Pytorch:为什么在 nn.modules.loss 和 nn.functional 模块中都实现了损失函数?

转载 作者:行者123 更新时间:2023-12-04 12:43:41 31 4
gpt4 key购买 nike

Pytorch 中的许多损失函数都在 nn.modules.loss 和 nn.functional 中实现。

例如,下面的两行返回相同的结果。

import torch.nn as nn
import torch.functional as F
nn.L1Loss()(x,y)
F.l1_loss(x,y)

为什么有两种实现方式?
  • 其他参数损失函数的一致性
  • 损失函数的实例化带来了一些好处
  • 否则
  • 最佳答案

    我认为它是一种部分应用情况 - 能够将许多配置变量与损失函数对象“捆绑”很有用。在大多数情况下,您的损失函数必须取 predictionground_truth作为其论据。这使得损失函数的基本 API 相当统一。但是,它们在细节上有所不同。例如,并非每个损失函数都有 reduction范围。 BCEWithLogitsLoss weightpos_weight参数; PoissonNLLLoss log_input , eps .写一个像这样的函数很方便

    def one_epoch(model, dataset, loss_fn, optimizer):
    for x, y in dataset:
    model.zero_grad()
    y_pred = model(x)
    loss = loss_fn(y_pred, y)
    loss.backward()
    optimizer.step()

    可以使用实例化 BCEWithLogitsLossPoissonNLLLoss 一样好.但由于需要记账,它不能与它们的功能对应物一起工作。相反,您必须首先创建
    loss_fn_packed = functools.partial(F.binary_cross_entropy_with_logits, weight=my_weight, reduction='sum')

    只有这样你才能使用它 one_epoch上面定义。但是这种包装已经提供了面向对象的损失 API,以及一些花里胡哨的东西(因为 loss 子类 nn.Module ,你可以使用向前和向后 Hook ,在 cpu 和 gpu 之间移动东西,等等)。

    关于Pytorch:为什么在 nn.modules.loss 和 nn.functional 模块中都实现了损失函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54662984/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com