2017-06-02 1 views
0

Je souhaite créer une fonction de perte personnalisée dans Torch, qui est une modification de ClassNLLCriterion. Concrètement, la perte ClassNLLCriterion est:Critère de torche de modification

loss(x, class) = -x[class] 

Je veux modifier ce soit:

loss(x, class) = -x[class]*K 

K est fonction de l'entrée du réseau, pas le poids du réseau ou réseau de sortie. Ainsi, K peut être traité comme une constante.

Quelle est la manière la plus simple de mettre en œuvre ce critère personnalisé? La fonction updateOutput() semble simple, mais comment puis-je modifier la fonction updateGradInput()?

Répondre

1

Fondamentalement, votre fonction de perte L est une fonction de l'entrée et de la cible. Vous avez donc

loss(input, target) = ClassNLLCriterion(input, target) * K 

si je comprends bien votre nouvelle perte. Ensuite, vous voulez mettre en œuvre updateGradInput qui renvoie la dérivée de votre fonction de perte par rapport à l'entrée, qui est

updateGradInput[ClassNLLCriterion](input, target) * K + ClassNLLCriterion(input, target) * dK/dinput 

donc vous suffit de calculer la dérivée de K wrt l'entrée de la fonction de perte (vous ne l'avez pas donnez-nous la formule pour calculer K) et branchez-la dans la ligne précédente. Puisque votre nouvelle fonction de perte repose sur ClassNLLCriterion, vous pouvez utiliser les updateGradInput et updateOutput de cette fonction de perte pour calculer la vôtre.

+0

Donc, essentiellement, je n'ai pas besoin d'écrire un critère personnalisé. Dans mon code d'entraînement, je peux simplement faire: 'loss = ClassNLLCriterion: forward() * K' puis ' grad = ClassNLLCriterion: arrière() * K + perte * (dK/dinput) ' Est-ce correct? – braindead

+0

Ouais c'est aussi possible – fonfonx

+0

Génial. Merci! Une autre question, si K est simplement une constante (ne dépend pas des paramètres réseau ou de l'entrée ou de la sortie), comment votre réponse changerait-elle dans ce cas? – braindead