Loss function_BASE

10773 ワード

私は別の投稿で詳しく話しています.言い換えればトーチです.nn.機能は関数TORCHnnはクラスです.そのため、トレーナーに入る様子が違います.
私が作成したトレーニングを例にとると、classを使用する場合はloss=class()に設定し、トレーニングのparams部分に入れ、functionを使用する場合は
トレーナーは損失を入力としてではなく、直接設定しなければならない.
もう一つ注意しなければならないのは、私がやっているトレーナーがlossとmetricを1 iterに設定していることです.つまり、minbatchを1回勉強した後、loss_batchに設定し、このような反復器の1 epochを繰り返した後、train_lossと呼ばれています.
そして最後のtrain_lossを配布させます.これは2つの状況があります.
1.設定した損失関数batchの平均値を求める
2.設定した損失関数batchの和を求める

CROSSENTROPYLOSS


https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss
torch.nn.CrossEntropyLoss(weight=None, size_average=None, 
ignore_index=-100, reduce=None, reduction='mean')
公式文書にもありますが、targetは0から始めなければなりません.F.one_hot(targets, num_classes=10)のためかもしれません.
直接カスタマイズしましょう.
CEEECECE============(ターゲット)log(ソフトmax(出力)-(ターゲット)mathm{log}(ソフトmax(出力)-(ソフトmax)log(出力).
softamxsoftamxsoftamx === eoutput∑eoutput\dfrac{e^{output}}{\displaystyle\sum{}e^{output}}∑eoutputeoutput​
このときtargetはonehotであり,targetが1である正解のoputput確率sorfmax値を計算するだけでよい.
参考までにここでitemを撮ると大変なことになります△実は私はやったことがありません.authorradを理解すれば、すぐにわかります.
ポイント.item()だとテンソルタイプが解け、gradも一緒に消えます.
Custom Code
import torch.nn.functional as F
    
def myCEE(outputs,targets):
    exp=torch.exp(outputs)
    A=torch.log(torch.sum(exp,dim=1))
    
    hadamard=F.one_hot(targets, num_classes=10).float()*outputs
    B=torch.sum(hadamard, dim=1)
    return torch.sum(A-B)
このように訓練した後、損失は4 epoch程度から始まり、nanを抽出・・・
探してみたらa numberじゃない理由がたくさんある
まず逆転波がいいこれを解決すればいい
loss_func = nn.CrossEntropyLoss(reduction='sum')  
loss_func(outputs,targets)
-------------------------------------------------------
tensor(147.5397, grad_fn=<NllLossBackward>)


myCEE(outputs,targets)
-------------------------------------------------------
tensor(147.5397, grad_fn=<SumBackward0>)
わあ、この価格は同じです.つまりよくできているということですがgrad fnが違っていて、よく見るとnllのあのcustom loss functionを探している間に、たくさん見かけました.customの時はそれを入れてるのにどうして入れなきゃいけないの?
それが何なのか探してください.
上記と同じように、トーチ.nn.functional.nl lossは関数、orchです.nn.NLLOSはクラスです.
調べてみましたが、これも損失関数です.nn.CrossEntropyLossにsoftmaxはありません
つまり、それは損失関数にすぎません.たぶんnnです.CrossEntropyLossはnn.NLLOSを引き継いだかららしいnan問題に関する文章はグーグルで思ったより多い.
直接探したことはないが,0のためと推測し,単純な実験のためにパラメータが少なすぎるモデルを構築したと考えられる.
したがって,モデルにボリュームを加えると,学習はもちろんより良くなり,39 epochでもnanは現れなかった.
しかし、それは私が作ったものと内蔵トーチのどの部分が違うのか疑問だ.
明らかに、lossを内蔵するのは私がそんなに簡単ではありません.装置があるはずですが、よく分かりません.
Stackoverflowに置きます.
https://stackoverflow.com/questions/69235383/pytorch-custom-loss-function-nn-crossentropyloss
また,nanの内容については後で多くなる可能性があるので,どの部分にnanが現れるかを正確に追跡し,整理する.