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

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

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

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

PyTorch

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

機械学習

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

Python

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

Q&A

解決済

1回答

6829閲覧

Pytorchで大きいepochで学習するとlossとaccが急激に変化する

Doggo

総合スコア12

深層学習

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

PyTorch

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

機械学習

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

Python

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

0グッド

1クリップ

投稿2020/03/28 18:26

前提・実現したいこと

Python 3.7.4
Pytorch 1.4.0

発生している問題・エラーメッセージ

Pytorchで重み学習済みVGG16モデルのfine-tuningを行っているのですが、200epoch学習させたら以下の画像ように
80epochあたりで急激にlossが増加し、accが低下しました。どのような原因が考えられるでしょうか?
model loss
model acc

該当のソースコード

python

1 # VGG-16モデルのインスタンスを生成 2use_pretrained = True # 学習済みのパラメータを使用 3net = models.vgg16(pretrained=use_pretrained) 4# 1000クラス → 10クラスに変更 5net.classifier[6] = nn.Linear(in_features=4096, out_features=10, bias=True) 6 7 8def do_train(net, dataloader_dict, criterion, optimizer, num_epochs): 9 10 # 初期設定 11 #学習中の指標を保存するリストを作成 12 #1epochのtrainに一応値を入れておく 13 train_acc_list = [0.] 14 train_loss_list = [0.] 15 val_acc_list = [] 16 val_loss_list = [] 17 18 # GPUが使えるかを確認 19 device = "cuda" if torch.cuda.is_available() else "cpu" 20 print("使用デバイス:", device) 21 22 # ネットワークをGPUへ 23 net = net.to(device) 24 if device == 'cuda': 25 net = torch.nn.DataParallel(net) # make parallel 26 27 # ネットワークがある程度固定であれば、高速化させる 28 torch.backends.cudnn.benchmark = True 29 30 # epochのループ 31 for epoch in range(num_epochs): 32 print('Epoch {}/{}'.format(epoch+1, num_epochs)) 33 print('-------------') 34 35 # epochごとの訓練と検証のループ 36 for phase in ['train', 'val']: 37 if phase == 'train': 38 net.train() # モデルを訓練モードに 39 else: 40 net.eval() # モデルを検証モードに 41 42 epoch_loss = 0.0 # epochの損失和 43 epoch_corrects = 0 # epochの正解数 44 45 # 未学習時の検証性能を確かめるため、epoch=0の訓練は省略 46 if (epoch == 0) and (phase == 'train'): 47 continue 48 49 # データローダーからミニバッチを取り出すループ 50 for inputs, labels in tqdm(dataloader_dict[phase]): 51 52 # GPUが使えるならGPUにデータを送る 53 inputs = inputs.to(device) 54 labels = labels.to(device) 55 56 # optimizerを初期化 57 optimizer.zero_grad() 58 59 60 # 順伝搬(forward)計算 61 with torch.set_grad_enabled(phase == 'train'): 62 outputs = net(inputs) 63 loss = criterion(outputs, labels) # 損失を計算 64 _, preds = torch.max(outputs, 1) # ラベルを予測 65 66 # 訓練時はバックプロパゲーション 67 if phase == 'train': 68 loss.backward() 69 optimizer.step() 70 71 # 結果の計算 72 epoch_loss += loss.item() * inputs.size(0) # lossの合計を更新 73 # 正解数の合計を更新 74 epoch_corrects += torch.sum(preds == labels.data) 75 76 # epochごとのlossと正解率を表示 77 epoch_loss = epoch_loss / len(dataloader_dict[phase].dataset) 78 epoch_acc = epoch_corrects.double( 79 ) / len(dataloader_dict[phase].dataset) 80 81 #listにlossとaccを保存 82 if phase == "train": 83 train_acc_list.append(epoch_acc) 84 train_loss_list.append(epoch_loss) 85 else: 86 val_acc_list.append(epoch_acc) 87 val_loss_list.append(epoch_loss) 88 89 print('{} Loss: {:.4f} Acc: {:.4f}'.format( 90 phase, epoch_loss, epoch_acc)) 91 92 # PyTorchのネットワークパラメータの保存 93 save_path = os.path.join(os.getcwd(), "final_weight.pth") 94 torch.save(net, save_path) 95 96 #dictで返す 97 history = {'acc': train_acc_list, 98 'loss': train_loss_list, 99 'val_acc': val_acc_list, 100 'val_loss': val_loss_list} 101 return history 102 103optimizer = optim.Adam(net.parameters()) 104criterion = nn.CrossEntropyLoss() 105 106num_epochs = 200 107hist = do_train(net, dataloader_dict, criterion, optimizer, num_epochs)

試したこと

環境によって起きたエラーかと思ったのでGoogle Colaboratory上でも実行してみましたが同様の結果が得られたので、コードに問題があると思っています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因は、optimizersにAdamを使用しているためです。長期間で訓練すると、損失が劇的に増えることが知られています。

これは、Adamのパラメータのデフォルト値などが引き起こしている原因です。詳しくはこちらを参考にしてください。対策としてはAdamのepsilonの値を変更するか、より安定したAMSGradを使用することだと思います。

参考資料)

https://stackoverflow.com/questions/52220242/why-does-the-loss-of-a-cnn-decrease-for-a-long-time-and-then-suddenly-increase

https://discuss.pytorch.org/t/loss-suddenly-increases-using-adam-optimizer/11338/3

投稿2020/04/30 17:02

bamboo-nova

総合スコア1408

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問