2017-09-25 68 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變量後,調用後向函數將爲所有因變量創建漸變。你不需要手動做。 –

相關問題