質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5468閲覧

[Python]Lossは減少するが学習途中でnanになってしまう

mek_41

総合スコア3

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/26 08:38

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

小さい値を入れれば解決しました!

投稿2021/09/20 05:49

mek_41

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問