Loss function_BASE
10773 ワード
私は別の投稿で詳しく話しています.言い換えればトーチです.nn.機能は関数TORCHnnはクラスです.そのため、トレーナーに入る様子が違います.
私が作成したトレーニングを例にとると、classを使用する場合は
トレーナーは損失を入力としてではなく、直接設定しなければならない.
もう一つ注意しなければならないのは、私がやっているトレーナーがlossとmetricを1 iterに設定していることです.つまり、minbatchを1回勉強した後、
そして最後の
1.設定した損失関数batchの平均値を求める
2.設定した損失関数batchの和を求める
https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss
直接カスタマイズしましょう.
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
探してみたらa numberじゃない理由がたくさんある
まず逆転波がいいこれを解決すればいい
それが何なのか探してください.
上記と同じように、トーチ.nn.functional.nl lossは関数、orchです.nn.NLLOSはクラスです.
調べてみましたが、これも損失関数です.nn.CrossEntropyLossにsoftmaxはありません
つまり、それは損失関数にすぎません.たぶんnnです.CrossEntropyLossはnn.NLLOSを引き継いだかららしい
直接探したことはないが,0のためと推測し,単純な実験のためにパラメータが少なすぎるモデルを構築したと考えられる.
したがって,モデルにボリュームを加えると,学習はもちろんより良くなり,39 epochでも
しかし、それは私が作ったものと内蔵トーチのどの部分が違うのか疑問だ.
明らかに、lossを内蔵するのは私がそんなに簡単ではありません.装置があるはずですが、よく分かりません.
Stackoverflowに置きます.
https://stackoverflow.com/questions/69235383/pytorch-custom-loss-function-nn-crossentropyloss
また,
私が作成したトレーニングを例にとると、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
が現れるかを正確に追跡し,整理する.Reference
この問題について(Loss function_BASE), 我々は、より多くの情報をここで見つけました https://velog.io/@jj770206/Loss-functionテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol