YutaroOgawa / pytorch_advanced

書籍「つくりながら学ぶ! PyTorchによる発展ディープラーニング」の実装コードを配置したリポジトリです
MIT License
844 stars 334 forks source link

【第4章6節:損失関数について】 #143

Open kawase621 opened 3 years ago

kawase621 commented 3 years ago

OpenPoseLossクラスの引数となる教師データ(heatmap_target及びpaf_target)は、0から1の間の数値に正規化されているとの認識です。

一方で、ネットワークであるOpenPoseNetの出力は、そのような正規化はされていないと思います。

OpenPoseNetの出力で、0から1の間の数値に正規化されているheatmap_target及びpaf_targetの値を回帰するのであれば、OpenPoseNetの出力も正規化(例えば、softmax関数を挟むなど)したほうが学習の効率が良い、ということはありませんか?

狙い値が0から1の間にあると分かっているにも関わらず、OpenPoseNetの出力として大きな値が出てしまうと、学習の初期の二乗誤差はとても大きな値になるように思えます。

お忙しいところ恐れ入りますが、ご教示下さい。

YutaroOgawa commented 3 years ago

@kawase621 さま

ご質問ありがとうございます。

第4章の姿勢推定では、以下のリポジトリを参考にしています。 原著および、以下のリポジトリから回答が見つかればと思います。

https://github.com/tensorboy/pytorch_Realtime_Multi-Person_Pose_Estimation

本書ではきちんとOpenPoseの学習をやり切るところまで実施していないので(感覚を体験していただくに留まっており)、 なんとも確実なことは言えないのですが、

softmaxなどで0-1に閉じ込めると、1付近と0付近は勾配がとても小さくなります。

すると、softmax手前の値がある程度以上(もしくは以下)であれば、softmax計算後の値はほぼ同じになり、ここらへんでの値が鈍感になるというデメリットがあります。

このデメリットが個人的には気になるところです。

回答になっておらず、大変申し訳ございませんが、どうぞ宜しくお願い致します

kawase621 commented 3 years ago

なるほど…正規化すると表現力が劣る場合もあるんですね。 回答頂きありがとうございました!!