在Pytorch中将L1损失略微调整为加权的L1损失,梯度计算是否仍然正常工作?

时间:2019-10-02 11:44:41

标签: python pytorch

我在Pytorch中实现了一个神经网络,我想使用加权L1损失函数来训练网络。

经常丢失L1的实现包含每个时期的以下代码:

optimiser.zero_grad()
net.train()        
_,forecast = net(torch.tensor(feature, dtype=torch.float).to(DEVICE))
loss = F.l1_loss(forecast, torch.tensor(target,dtype=torch.float).to(DEVICE),reduction='mean')
loss.backward()
params.append(net.parameters())
optimiser.step()

现在,我想使用加权L1损失。因此,我想再次使用相同的标准Pytorch L1函数,并使用权重重新调整预测和目标。梯度计算是否仍能正确完成?

optimiser.zero_grad()
net.train()        
_,forecast = net(torch.tensor(feature, dtype=torch.float).to(DEVICE))
loss = F.l1_loss(torch.t(torch.mul(torch.t(forecast), 
                                           torch.tensor(weight,dtype=torch.float).to(DEVICE))) ,
                         torch.t(torch.mul(torch.t(torch.tensor(target,dtype=torch.float).to(DEVICE)), 
                                           torch.tensor(weight,dtype=torch.float).to(DEVICE))),reduction='mean')
loss.backward()
params.append(net.parameters())
optimiser.step()

1 个答案:

答案 0 :(得分:1)

是的,这是正确的。

如果不使用就地操作,则可以正确计算梯度。此外,在当前版本的Pytorch中,如果不小心在程序中包含一些就地操作,则会报告错误。

这里是一个相关的discussion。您可以在此处找到更多信息。