将Loss视作单独的层,在forward函数里写明loss的计算方式,无需定义backward
class MyLoss(nn.Module):
def __init__(self):
super(MyLoss, self).__init__()
print '1'
def forward(self, pred, truth):
return torch.mean(torch.mean((pred-truth)**2,1),0)
初始化函数一定要添加
super(MyLoss, self).__init__()
否则出现 AttributeError: 'MyLoss' object has no attribute '_forward_pre_hooks' 错误。
要打印loss可以用
loss.data.cpu().numpy()[0]
访问。
如果考虑多个loss同时约束优化网络,可以参考这里,主要有两种方式,最简单且直白的方法即
loss1 = criterion(p1, y1)
loss2 = criterion(p1, y2)
loss = loss1 + loss2
loss.backward()
optimizer.step()