2017-09-25 3 views
1

私はすでに自分自身の損失機能を定義しています。それは動作します。フィードフォワードに問題がない可能性があります。しかし、backward()を定義していないので、正しいかどうかはわかりません。カスタム損失機能でbackward()を定義する必要がありますか?

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)backward()を定義する方法は?

3)トーチでSGDを実行中にデータのインデックスを作成する方法はありますか?

答えて

2

以下のような損失関数を書くことができます。

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

逆方向機能を実装する必要はありません。上記の損失関数のすべてのパラメータはPyTorch変数でなければならず、残りはtorch.autograd関数によって処理されます。

+0

ありがとうございました。しかし、もし私が後ろに書いておきたいのであれば?私は勾配を計算するためにチェーンルールを使用する方法を知っていますが、私は神経ネットワークの各重量またはバイアスのために微分を書くことはできないと思います。何かガイダンスがありますか? – Ruijian

+0

pyTorch変数を計算すると、backward関数を呼び出すと、すべての従属変数のグラデーションが作成されます。手動で行う必要はありません。 –

関連する問題