2017-09-25 62 views
1

我已经定义了我自己的损失函数。它确实有效。前馈可能没有问题。但我不确定它是否正确,因为我没有定义落后()。我是否需要在自定义丢失函数中定义落后()?

class _Loss(nn.Module): 
    def __init__(self, size_average=True): 
     super(_Loss, self).__init__() 
     self.size_average = size_average 
class MyLoss(_Loss): 
    def forward(self, input, target): 
     loss = 0 
     weight = np.zeros((BATCH_SIZE,BATCH_SIZE)) 
     for a in range(BATCH_SIZE): 
      for b in range(BATCH_SIZE): 
       weight[a][b] = get_weight(target.data[a][0]) 
     for i in range(BATCH_SIZE): 
      for j in range(BATCH_SIZE): 
       a_ij= (input[i]-input[j]-target[i]+target[j])*weight[i,j] 
       loss += F.relu(a_ij) 
     return loss 

我想问的问题是,

1)我需要向后()定义了损失函数?

2)如何定义落后()?

3)是否有任何方法可以做torch的SGD时的数据索引?

回答

2

你可以写下如下的损失函数。

def mse_loss(input, target): 
      return ((input - target) ** 2).sum()/input.data.nelement() 

您不需要实现后向功能。以上所有损失函数的参数都应该是PyTorch变量,其余部分由torch.autograd函数处理。

+0

感谢您的帮助。但是如果我想写下落后呢?我知道如何使用链式法则来计算梯度,但我不认为我可以为神经网络中的每个权重或偏差写出导数。你有一些指导。 – Ruijian

+0

计算pyTorch变量后,调用后向函数将为所有因变量创建渐变。你不需要手动做。 –

相关问题