1.前提・実現したいこと
同時にオリジナルのLoss(ContrastiveLoss)とCrossEntropyLossの二つのLossを計算し、それぞれLossを出力しようとしています。
2.発生している問題・エラーメッセージ
学習の最初はlossが下がっていくのですが29/50あたりからlossがnanになってしまいます。
学習の途中でlossがnanになってしまう問題を解決したいです。
Epoch 28/ 50 ContrastiveLoss=0.0752 CrossEntropyLoss=0.1968 ValAccuracy=92.97% miou=28.62% Epoch 29/ 50 ContrastiveLoss=nan CrossEntropyLoss=nan ValAccuracy=92.78% miou=23.19% Epoch 30/ 50 ContrastiveLoss=nan CrossEntropyLoss=nan ValAccuracy=92.78% miou=23.19%
3.該当のソースコード
Python
1############## train関数 ############## 2def train(epoch): 3 4 model.train() 5 6 # 初期設定 7 sum_loss1 = 0 #提案手法のloss 8 sum_loss2 = 0 #softmax cross entropy loss 9 correct = 0 10 total = 0 11 12 # 学習ループ inputs:入力画像 targets:教師ラベル 13 for batch_idx, (inputs, targets) in enumerate(tqdm(train_loader, leave=False)): 14 15 # GPUモード 16 inputs = inputs.cuda(device) 17 targets = targets.cuda(device) 18 19 # 教師ラベルをlongモードに変換 20 targets = targets.long() 21 22 # 入力画像をモデルに入力 23 y,output = model(inputs) 24 25 # 損失計算 criterion1->オリジナルのloss criterion2->softmax cross entropy loss 26 loss1 = criterion1(output, targets) 27 loss2 = criterion2(y, targets) 28 loss = loss1 + loss2 29 30 # 勾配を0に 31 optimizer.zero_grad() 32 33 # 誤差逆伝搬 34 loss.backward() 35 36 # パラメーター更新 37 optimizer.step() 38 39 # loss溜め 40 sum_loss1 += loss1.item() 41 sum_loss2 += loss2.item() 42 43 44 #精度の計算# 45 # 出力をsoftmax関数に(0~1) 46 output = F.softmax(y, dim=1) 47 48 # 最大ベクトル 49 _, predicted = output.max(1) 50 51 # total = 正解, correct = 予測 52 total += (targets.size(0)*targets.size(1)*targets.size(2)) 53 correct += predicted.eq(targets).sum().item() #predicted.eq(targets) : 教師ラベルと一致していたらTrue, 不一致ならFalse 54 55 return sum_loss1/(batch_idx+1), sum_loss2/(batch_idx+1), correct/total 56 57############## main ############## 58if __name__ == '__main__': 59 ##省略 60 61 # 損失関数設定 62 criterion1 = SquareLoss(device=device) #提案手法のloss 63 criterion2 = nn.CrossEntropyLoss() #Softmax Cross Entropy Loss
4.自分で調べたことや試したこと
調べたらlogの中が0になってしまうことが問題と出てきて来ました。CrossEntropyLossは自作ではないのでどうやって中に小さな値を入れたらいいのかわかりませんでした。
また、CrossEntropyLossを利用してSoftmaxCrossEntrppyにするというのもありましたがよくわかりませんでした。
5.補足情報
python3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。