我以前在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()
这行得通吗?/如何退回自定义损失新损失?
答案 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