考えられる原因1
YOLOv3でも学習時にnan
が出るケースがあるらしく,それを指摘したissueではバッチサイズが1である場合に起きるのではという議論がなされていました.
もう少し,具体的なハイパーパラメータを示していただけると原因の探究ができそうです.
考えられる原因2
Cross-Entropyを使っていることが原因説1.
対数関数$\log(x)$が使われるので,0を入力に取ると$\log(0)=-\infty$すなわちnan
になる.
考えられる原因3
Sigmoid関数を使っていることが原因説1.
桁数多めの負の値(-500とか)を入力に取ると32bit精度の浮動小数点数では$0$が出力される.これを用いて計算するCross-Entropyや0除算によってnan
になる.
考えられる原因4
重みが無限大にまで増大したことが原因説1.
YOLOv5の仕様を理解していないのですが,もし内部で重み正則化項を損失のペナルティとして使っているのなら考えなくてよさそうです.最近のものは全部入っている印象ですが
考えられる原因5
データセットが原因説2.
独自データとのことなので有り得る.
考えられる原因6
メモリ不足説.
GTX 1650は4[GB]らしいですが,YOLOv5のモデルサイズ(s, m , l , x)のどれを採用しているのですか?
既にGPU_memが3.42Gを指しており,圧迫しているようにも見えます.
あまり考えたくない原因7
やはり環境がおかしい
感想
最初からnan
のままってのはあまり考えられないのです.具体的にどういう学習したのか教えていただけると幸いです.
場合によっては、学習は進むのですが、GPUを認識しない
という件が気になります.環境設定の問題かメモリ不足によってCPUに切り替えさせられたとかの原因が考えられます.ここで言う「場合によっては」を具体的に教えて欲しいです.実行ごとに異なるならその旨を記してください.
とりあえず,YOLOv5を動かすことにこだわらず,超絶シンプルなモデル3を作成してGPUを使った学習をしてみるのが一番だと考えられます.問題の切り分けをするにはそれしかありません.もし超絶シンプルモデルが動かないなら環境のせいです.モデルを大きくして(U-Netとか良さそう)4動かないならメモリ不足,それでも動くなら...って感じでやりましょう.