【问题标题】:Computing loss along batch dimension in PyTorch在 PyTorch 中沿批次维度计算损失
【发布时间】:2021-01-19 23:44:28
【问题描述】:

我有BxCxHxW 的张量,其中B 是批次。我感兴趣的是,当批量大小大于 1 时,PyTorch 中的损失是如何实现的。下面是我们通常在 PyTorch 中做的事情,

l1_loss = torch.nn.L1Loss()
loss = l1_loss(pred,gt)

loss 是不是这个批次的平均损失?

如果确实如此,那么下面的代码是不是就相当于我们平时在 PyTorch 中做的(上面的代码)?

l1_loss = torch.nn.L1Loss()

for idx in range(B):
  if idx==0:
    loss = l1_loss(pred[idx,:,:,:],gt[idx,:,:,:])
  else:
    loss = l1_loss(pred[idx,:,:,:],gt[idx,:,:,:]) + loss

loss = loss/B

【问题讨论】:

    标签: neural-network pytorch conv-neural-network


    【解决方案1】:

    documentation 描述了L1loss 的行为:它确实(默认情况下)是整个批次的平均值。您可以轻松地将其更改为总和:

    l1_loss = torch.nn.L1Loss(reduction='sum')
    

    是的,您的代码等同于 Pytorch 所做的。没有调用L1loss 的版本是:

    # Assuming your output is a vector of shape (B, F)
    loss = torch.abs(pred - gt).sum(dim=1).mean(dim=0)
    

    【讨论】:

      【解决方案2】:

      如果您的问题是他们是否像您提到的那样做“某事”,那么答案是肯定的。然而不完全一样,他们保持了他们的架构设计(面向对象),但他们计算损失的默认方式是你已经猜到的批量维度。所以你可以用这样的东西让你的语法更紧凑-

      def l1_loss(output, target):
          loss = torch.abs(output - target).sum(dim=1).mean(dim=0)
          return loss
      

      【讨论】:

        猜你喜欢
        • 2022-07-14
        • 1970-01-01
        • 2019-05-16
        • 2022-01-09
        • 2020-08-13
        • 1970-01-01
        • 2020-12-23
        • 2023-02-06
        • 1970-01-01
        相关资源
        最近更新 更多