在pytorch中如何使用自定义损失函数来做向后()?

时间:2019-01-21 07:22:51

标签: deep-learning pytorch loss-function

我以前在pytorch中使用了MSE


criterion = nn.MSELoss(size_average=False).cuda()

...

loss = criterion(output, target)

loss.backward()

这很好用


现在我写了一个自定义损失,名为class newLoss


#this is in model.py

class newLoss(nn.Module):

    def __init__(self):

        super(newLoss, self).__init__()

    def forward(self, output, gt):

        loss = 0

        for row_out, row_gt :

            for pixel_out, pixel_gt :

            loss += something pixelwise

        return loss

# this is in train.py

newloss = newLoss()

loss = newloss(output,gt)

但是我得到一个float类型的损失,并引发这个错误

''AttributeError:'float'对象没有属性'backward'


现在,我将newloss的值添加到MSE类型的原始损失中,如下所示:


criterion = nn.MSELoss(size_average=False).cuda()

...

loss = criterion(output, target)

newloss= newLoss()

loss += newloss(output,gt)

loss.backward()

这行得通吗?/如何退回自定义损失新损失?

1 个答案:

答案 0 :(得分:0)

这是在PyTorch中定义自定义损失函数的方式。我将为您提供一个简单的ReLU示例,您可以尝试定义自己的MSE损失函数。

在PyTorch中,您可以将要素保存在上下文对象中,并在反向传播期间取回。

import torch
from torch.autograd.function import Function

class ReLU(Function):

    @staticmethod
    def forward(ctx, in_feat):
        ctx.save_for_backward(in_feat)
        return in_feat.clamp(min=0)

    @staticmethod
    def backward(ctx, grad_output):
        in_feat, = ctx.saved_tensors
        grad_input = grad_output.clone()
        grad_input[in_feat < 0] = 0
        return grad_input