在Pytorch中自定义距离损失功能?

时间:2019-10-29 18:50:54

标签: pytorch loss-function

我想在pytorch中实现以下距离损失功能。我正在关注pytorch论坛上的https://discuss.pytorch.org/t/custom-loss-functions/29387/4主题

[
  {
    "_id": "5d978d372f263f41cc624727",
    "availability": 66
  },
  {
    "_id": "5d978d372f263f41cc624728",
     "availability": 33,
  }
  {
    "_id": "5d978d372f263f41cc624729",
     "availability": 0,  
  }
]

所以我已经实现了这样的损失功能

np.linalg.norm(output - target)
# where output.shape = [1, 2] and target.shape = [1, 2]

使用此损失功能,向后调用会导致运行时错误

def my_loss(output, target):    
    loss = torch.tensor(np.linalg.norm(output.detach().numpy() - target.detach().numpy()))
    return loss

我的整个代码如下

RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

PS:我知道pytorch的成对丢失,但是由于它的某些限制,我必须自己实现。

在pytorch源代码之后,我尝试了以下方法,

model = nn.Linear(2, 2)

x = torch.randn(1, 2)
target = torch.randn(1, 2)
output = model(x)

loss = my_loss(output, target)
loss.backward()   <----- Error here

print(model.weight.grad)

我收到运行时错误

class my_function(torch.nn.Module): # forgot to define backward()
    def forward(self, output, target):

        loss = torch.tensor(np.linalg.norm(output.detach().numpy() - target.detach().numpy()))
        return loss

model = nn.Linear(2, 2)
x = torch.randn(1, 2)
target = torch.randn(1, 2)
output = model(x)

criterion = my_function()

loss = criterion(output, target)


loss.backward()
print(model.weight.grad)

如何正确实现损失功能?

1 个答案:

答案 0 :(得分:5)

之所以发生这种情况,是因为在损失函数中,您正在分离张量。您必须分离,因为您想使用np.linalg.norm。这会破坏图形,您会得到张量没有梯度fn的错误。

您可以替换

loss = torch.tensor(np.linalg.norm(output.detach().numpy() - target.detach().numpy()))

通过

进行割炬操作

loss = torch.norm(output-target)

这应该工作正常。