TRANSFER LEARNING FOR INFORMATIQUE VISION STRUCT Qu'est-ce que c'est dans le code de (1)? J'ai écrit un article parce que je voulais résumer ce que je pensais. Si vous faites une erreur, je vous serais reconnaissant de bien vouloir commenter.
optimizer.zero_grad()
C'est une ligne discrètement dans train_model function, mais c'est une fonction assez importante pour initialiser l'accumulation de dégradés. .. Si le gradient est accumulé sans initialisation, il ne convergera pas. Lors de la mise à jour du poids $ W $, il est basé sur la méthode de descente la plus raide
W = W - \eta \frac{\partial L}{\partial W}
De cette formule
\frac{\partial L}{\partial W}
Cette partie est le dégradé. $ \ Eta $ est le taux d'apprentissage. Par conséquent, ```optimizer.zero_grad () `` `est requis lors de l'apprentissage.
set_grad_enabled() fonction train_model est une fonction appelée comme une clause with. Après avoir vérifié qu'il n'y a pas de problème de calcul sans cela, [Créer un graphe de calcul](https://discuss.pytorch.org/t/why-we-need-torch-set-grad-enabled-false-here / 41240) Dans (2), la propagation vers l'avant et la propagation arrière sont nécessaires pendant l'apprentissage, mais la propagation arrière n'est pas utilisée pendant l'évaluation, de sorte que l'on pense que le but est de réduire la quantité de calcul. Puisque j'utilise la clause with, est-ce lié à la sécurisation de la mémoire?
running_loss += loss.item() * inputs.size(0) La première fois que vous le voyez dans la fonction train_model? C'est une ligne qui devient. En premier lieu dans la définition de la fonction de perte
criterion = nn.CrossEntropyLoss()
loss = criterion(outputs, labels)
Si vous regardez CrossEntropyLoss, l'argument est
reduction = 'mean'``` Il y a. En d'autres termes, puisque la valeur de perte moyenne est renvoyée par défaut, il n'y a pas de problème avec l'apprentissage par lots, mais avec l'apprentissage par mini-lots, il est nécessaire de passer de la valeur moyenne (moyenne) à la somme (somme). Donc,
running_loss += loss.item() * inputs.size(0)
La valeur de perte moyenne d'un mini-lot petit et difficile est multipliée par le nombre d'échantillons du mini-lot pour le ramener à la valeur d'origine. Au fait, même si tu ne fais pas ça
criterion = nn.CrossEntropyLoss(reduction='sum')
Renvoie le même résultat que `` loss.item () * inputs.size (0) ''. Alors
#running_loss += loss.item() * inputs.size(0)
running_loss += loss.item()
Vous pouvez l'écrire docilement sans rien faire d'étrange. Pour le moment, il est également mentionné dans ici (3).
criterion = nn.CrossEntropyLoss(reduction='sum')Après avoir trouvé la valeur de perte avec, la rétropropagation donne nan.[punaise](https://github.com/pytorch/pytorch/issues/17350)(4)Il semble y avoir.
Alors soyez doux '' `` running_loss + = loss.item () * inputs.size (0) '' `` Cela peut être préférable d'utiliser
## à la fin
Je continuerai d'écrire quand il y aura plus d'endroits à craindre.
## Matériel de référence
(1) [TRANSFER LEARNING FOR COMPUTER VISION TUTORIAL](https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html?highlight=transfer%20learning)
(2) [Why we need torch.set_grad_enabled(False) here?](https://discuss.pytorch.org/t/why-we-need-torch-set-grad-enabled-false-here/41240)
(3) [Issue about updating training loss #2](https://github.com/udacity/deep-learning-v2-pytorch/issues/2)
(4) [torch.nn.CrossEntropyLoss with "reduction" sum/mean is not deterministic on segmentation outputs / labels #17350](https://github.com/pytorch/pytorch/issues/17350)
Recommended Posts