我在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()
答案 0 :(得分:1)
是的,这是正确的。
如果不使用就地操作,则可以正确计算梯度。此外,在当前版本的Pytorch中,如果不小心在程序中包含一些就地操作,则会报告错误。
这里是一个相关的discussion。您可以在此处找到更多信息。