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

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

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

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

機械学習

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

Q&A

解決済

2回答

7583閲覧

機械学習でlossが急に上がる原因

harug

総合スコア28

深層学習

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

機械学習

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

0グッド

1クリップ

投稿2022/07/06 03:06

編集2022/07/10 06:18

質問内容

機械学習の学習精度が上がらず困っています.

実験環境は以下の通りです.

  • モデル構造やその他関数:こちらを参考にしました(ベースネットワークはCNNに変更↓).
  • 入力画像サイズ:128×64(縦×横)
  • 訓練データ数:約90万ペアの画像(MNISTではない)を使用.
  • 検証用データ数:約6万ペア
  • バッチサイズ:32
  • エポック:100

変更したCNNのモデル構造です.

python

1 model = models.Sequential() 2 3 weight_decay = 1e-4 4 5 model.add( 6 layers.Conv2D( 7 filters=64, 8 kernel_size=(3, 3), 9 input_shape=(height, width, 1), 10 padding='same', 11 kernel_regularizer=regularizers.l2( 12 weight_decay), 13 activation='relu' 14 )) 15 16 17 model.add( 18 layers.Conv2D( 19 filters=32, 20 kernel_size=(3, 3), 21 padding='same', 22 kernel_regularizer=regularizers.l2( 23 weight_decay), 24 activation='relu' 25 )) 26 27 28 model.add( 29 layers.MaxPooling2D( 30 pool_size=(2, 2))) 31 32 33 model.add( 34 layers.Conv2D( 35 filters=16, 36 kernel_size=(3, 3), 37 padding='same', 38 kernel_regularizer=regularizers.l2( 39 weight_decay), 40 activation='relu' 41 )) 42 43 44 model.add( 45 layers.MaxPooling2D( 46 pool_size=(2, 2))) 47 48 49 model.add(layers.Dropout(0.4)) 50 51 52 model.add(layers.Flatten()) 53 54 55 model.add( 56 layers.Dense( 57 128, 58 activation='relu')) 59

次に示すものが,60エポックまでを実行した結果になります.
まだ,100エポックまでは学習できていないのですが,明らかにおかしな結果となっているため質問させていただきます.

Epoch 1/100 28203/28203 [==============================] - 909s 32ms/step - loss: 0.0054 - accuracy: 0.9973 - val_loss: 0.0869 - val_accuracy: 0.8809 Epoch 2/100 28203/28203 [==============================] - 927s 33ms/step - loss: 0.0055 - accuracy: 0.9967 - val_loss: 0.0871 - val_accuracy: 0.8823 Epoch 3/100 28203/28203 [==============================] - 934s 33ms/step - loss: 0.0080 - accuracy: 0.9928 - val_loss: 0.0870 - val_accuracy: 0.8823 Epoch 4/100 28203/28203 [==============================] - 931s 33ms/step - loss: 0.0088 - accuracy: 0.9916 - val_loss: 0.0859 - val_accuracy: 0.8820 Epoch 5/100 28203/28203 [==============================] - 922s 33ms/step - loss: 0.0127 - accuracy: 0.9859 - val_loss: 0.0850 - val_accuracy: 0.8806 Epoch 6/100 28203/28203 [==============================] - 915s 32ms/step - loss: 0.0176 - accuracy: 0.9788 - val_loss: 0.0805 - val_accuracy: 0.8817 Epoch 7/100 28203/28203 [==============================] - 922s 33ms/step - loss: 0.0178 - accuracy: 0.9785 - val_loss: 0.0773 - val_accuracy: 0.8798 Epoch 8/100 28203/28203 [==============================] - 934s 33ms/step - loss: 0.0221 - accuracy: 0.9745 - val_loss: 0.0685 - val_accuracy: 0.8861 Epoch 9/100 28203/28203 [==============================] - 909s 32ms/step - loss: 0.0317 - accuracy: 0.9674 - val_loss: 0.0496 - val_accuracy: 0.9331 Epoch 10/100 28203/28203 [==============================] - 916s 32ms/step - loss: 0.0462 - accuracy: 0.9602 - val_loss: 0.6956 - val_accuracy: 0.0393 Epoch 11/100 28203/28203 [==============================] - 932s 33ms/step - loss: 0.0543 - accuracy: 0.9574 - val_loss: 0.9462 - val_accuracy: 0.0393 Epoch 12/100 28203/28203 [==============================] - 915s 32ms/step - loss: 0.0479 - accuracy: 0.9583 - val_loss: 0.9610 - val_accuracy: 0.0393 Epoch 13/100 28203/28203 [==============================] - 920s 33ms/step - loss: 0.0467 - accuracy: 0.9588 - val_loss: 0.9506 - val_accuracy: 0.0393 Epoch 14/100 28203/28203 [==============================] - 920s 33ms/step - loss: 0.0456 - accuracy: 0.9590 - val_loss: 0.9570 - val_accuracy: 0.0393 Epoch 15/100 28203/28203 [==============================] - 944s 33ms/step - loss: 0.0457 - accuracy: 0.9590 - val_loss: 0.9527 - val_accuracy: 0.0393 Epoch 16/100 28203/28203 [==============================] - 920s 33ms/step - loss: 0.0456 - accuracy: 0.9587 - val_loss: 0.9543 - val_accuracy: 0.0393 Epoch 17/100 28203/28203 [==============================] - 903s 32ms/step - loss: 0.0450 - accuracy: 0.9588 - val_loss: 0.9430 - val_accuracy: 0.0393 Epoch 18/100 28203/28203 [==============================] - 934s 33ms/step - loss: 0.0449 - accuracy: 0.9585 - val_loss: 0.9051 - val_accuracy: 0.0393 Epoch 19/100 28203/28203 [==============================] - 934s 33ms/step - loss: 0.0457 - accuracy: 0.9575 - val_loss: 0.9381 - val_accuracy: 0.0393 Epoch 20/100 28203/28203 [==============================] - 911s 32ms/step - loss: 0.0465 - accuracy: 0.9566 - val_loss: 0.9509 - val_accuracy: 0.0393 Epoch 21/100 28203/28203 [==============================] - 933s 33ms/step - loss: 0.0465 - accuracy: 0.9564 - val_loss: 0.9289 - val_accuracy: 0.0393 Epoch 22/100 28203/28203 [==============================] - 934s 33ms/step - loss: 0.0458 - accuracy: 0.9575 - val_loss: 0.9283 - val_accuracy: 0.0393 Epoch 23/100 28203/28203 [==============================] - 915s 32ms/step - loss: 0.0452 - accuracy: 0.9576 - val_loss: 0.9506 - val_accuracy: 0.0393 Epoch 24/100 28203/28203 [==============================] - 904s 32ms/step - loss: 0.0455 - accuracy: 0.9578 - val_loss: 0.9145 - val_accuracy: 0.0393 Epoch 25/100 28203/28203 [==============================] - 933s 33ms/step - loss: 0.0455 - accuracy: 0.9576 - val_loss: 0.9443 - val_accuracy: 0.0393 Epoch 26/100 28203/28203 [==============================] - 923s 33ms/step - loss: 0.0455 - accuracy: 0.9577 - val_loss: 0.9385 - val_accuracy: 0.0393 Epoch 27/100 28203/28203 [==============================] - 934s 33ms/step - loss: 0.0455 - accuracy: 0.9574 - val_loss: 0.9581 - val_accuracy: 0.0393 Epoch 28/100 28203/28203 [==============================] - 906s 32ms/step - loss: 0.0457 - accuracy: 0.9571 - val_loss: 0.9508 - val_accuracy: 0.0393 Epoch 29/100 28203/28203 [==============================] - 933s 33ms/step - loss: 0.0459 - accuracy: 0.9563 - val_loss: 0.8768 - val_accuracy: 0.0393 Epoch 30/100 28203/28203 [==============================] - 915s 32ms/step - loss: 0.0455 - accuracy: 0.9565 - val_loss: 0.9283 - val_accuracy: 0.0393 Epoch 31/100 28203/28203 [==============================] - 918s 33ms/step - loss: 0.0452 - accuracy: 0.9571 - val_loss: 0.9602 - val_accuracy: 0.0393 Epoch 32/100 28203/28203 [==============================] - 919s 33ms/step - loss: 0.0461 - accuracy: 0.9569 - val_loss: 0.9412 - val_accuracy: 0.0393 Epoch 33/100 28203/28203 [==============================] - 933s 33ms/step - loss: 0.0465 - accuracy: 0.9565 - val_loss: 0.9512 - val_accuracy: 0.0393 Epoch 34/100 28203/28203 [==============================] - 925s 33ms/step - loss: 0.0471 - accuracy: 0.9563 - val_loss: 0.9471 - val_accuracy: 0.0393 Epoch 35/100 28203/28203 [==============================] - 933s 33ms/step - loss: 0.0464 - accuracy: 0.9562 - val_loss: 0.9475 - val_accuracy: 0.0393 Epoch 36/100 28203/28203 [==============================] - 915s 32ms/step - loss: 0.0464 - accuracy: 0.9567 - val_loss: 0.8290 - val_accuracy: 0.0385 Epoch 37/100 28203/28203 [==============================] - 932s 33ms/step - loss: 0.0462 - accuracy: 0.9568 - val_loss: 0.9415 - val_accuracy: 0.0393 Epoch 38/100 28203/28203 [==============================] - 923s 33ms/step - loss: 0.0463 - accuracy: 0.9568 - val_loss: 0.9611 - val_accuracy: 0.0385 Epoch 39/100 28203/28203 [==============================] - 919s 33ms/step - loss: 0.0468 - accuracy: 0.9565 - val_loss: 0.9611 - val_accuracy: 0.0393 Epoch 40/100 28203/28203 [==============================] - 923s 33ms/step - loss: 0.0479 - accuracy: 0.9571 - val_loss: 0.9608 - val_accuracy: 0.0393 Epoch 41/100 28203/28203 [==============================] - 924s 33ms/step - loss: 0.5128 - accuracy: 0.4930 - val_loss: 0.9604 - val_accuracy: 0.0393 Epoch 42/100 28203/28203 [==============================] - 921s 33ms/step - loss: 0.9586 - accuracy: 0.0410 - val_loss: 0.9604 - val_accuracy: 0.0393 Epoch 43/100 28203/28203 [==============================] - 922s 33ms/step - loss: 0.9586 - accuracy: 0.0410 - val_loss: 0.9604 - val_accuracy: 0.0393 Epoch 44/100 28203/28203 [==============================] - 939s 33ms/step - loss: 0.9586 - accuracy: 0.0410 - val_loss: 0.9604 - val_accuracy: 0.0393 (同じ結果なので省略) Epoch 58/100 28203/28203 [==============================] - 932s 33ms/step - loss: 0.9586 - accuracy: 0.0410 - val_loss: 0.9604 - val_accuracy: 0.0393 Epoch 59/100 28203/28203 [==============================] - 922s 33ms/step - loss: 0.9586 - accuracy: 0.0410 - val_loss: 0.9604 - val_accuracy: 0.0393 Epoch 60/100 28203/28203 [==============================] - 915s 32ms/step - loss: 0.9586 - accuracy: 0.0410 - val_loss: 0.9604 - val_accuracy: 0.0393

9エポックまではlossとval_lossは比較的低い値なのですが,10エポック以降では急激にval_lossが大きな値をとり,41エポック以降はlossも大きな値をとるようになってしまっています.正解率も途中まではよかったのですが,いきなり0付近の値になってしまいます.

これは何が原因で起こってしまっている問題なのでしょうか.
また,何をどのように改善するとよいのかご教授いただければ幸いです.

補足情報(FW/ツールのバージョンなど)

ubuntu 20.04
Python 3.8.10

tensorflow-gpu 2.5.3
keras 2.8.0
numpy 1.19.5

jupyter lab 2.3.2


追記1

バッチサイズを128に増やした結果です.

バッチサイズ:128


追記2

バッチサイズを32にした結果です.
データ数は約7万にし,同じクラス・違うクラスでほぼ同じ割合でペアを作成しています.

バッチサイズ:32,  データ数:約7万

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

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

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

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

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

jbpb0

2022/07/06 05:28

バッチサイズを増やしたり、学習率を減らしたりしてみるとか
harug

2022/07/06 06:04

回答ありがとうございます. 学習率の変更とは,モデルをコンパイルする際にoptimizer=rmsで引数として与えている,rms = RMSprop()の中に学習率を指定するという認識で正しいでしょうか.
jbpb0

2022/07/06 07:42 編集

> RMSprop()の中に学習率を指定 そうです > 10エポック以降では急激にval_lossが大きな値をとり,41エポック以降はlossも大きな値をとるようになってしまっています. valの方が先に悪化してるので、_Victorique__さんが回答に書いてるように過学習してる気配がありますが、それ以前に、valが付いてるのも付いてないのも共通して、学習開始からの傾向がlossは増えてaccuracyは減ってるので、そもそも最初から学習がうまくいってないようなので、バッチサイズを増やしたり、学習率を減らしたりしたら直るかも、と思い書きました まずは、valが付いてない方だけでもlossが減ってaccuracyが増える状態になるようにしてから、それでもvalがダメなら過学習の対策したらいいと思います
harug

2022/07/07 08:30

ご指摘ありがとうございます. バッチサイズを128に変更した結果を,質問内容に追記しました. こちらの結果からは,loss,accuracyが4つとも一定であるように見えますが,過学習を起こしている状態とはまた違った状態なのでしょうか. 大変恐縮ですが,結果から考察できることがあれば教えていただきたいです.
jbpb0

2022/07/07 11:04 編集

バッチサイズを128に増やした結果を見ると、1エポック目からlossがほぼ0、accuracyがほぼ1と、それ以上学習する必要が無い状態に見えますが、そんな都合の良いことは滅多に起きません 参考にしてるWebページと同様に、画像間の距離を計算して、画像のペアが同じクラスかどうかを分類しようとしてるのでしょうか? もしそうなら、同じクラスのペアと違うクラスのペアの割合はどれくらいでしょうか? どちらかが極端に少ない、ということはありませんでしょうか?
harug

2022/07/07 11:13

同じクラスのペア,違うクラスのペアの割合は1:23くらいの割合です(全通りの組み合わせにおいてペアを作成しています). 同じクラスのペアよりも違うクラスのペアがたくさんあるなら,その割合のまま学習させたほうが精度は上がると考えました. もしかしてそれが原因なのでしょうか. 同じ割合でペアを生成する必要があるのでしょうか.
jbpb0

2022/07/09 15:52 編集

> 同じクラスのペア,違うクラスのペアの割合は1:23くらいの割合 AIが、全部「違うクラス」と推定した場合、間違えるのは1/24しかないので、accuracyは23/24=0.96となります val_accuracyは0.9弱なので、完全に上記の通りではないですが、もしかしたらそれに近い状態かもしれません もしそうなら、それは望ましい状態ではないですよね それを確認するために、学習後に、valデータを真値が「同じクラス」と「違うクラス」に分けて、それぞれでaccuracy(正解率)を計算することをお勧めします こういう場合に起きがちなのは、多いサンプルは正解率めちゃ高いけど、少ないサンプルは正解率ダメダメになること もしそうなってるのなら、 > 同じ割合でペアを生成する必要がある となります 参考 https://qiita.com/kento1109/items/1fc7488163b0f350f2fa https://qiita.com/ryouta0506/items/619d9ac0d80f8c0aed92
harug

2022/07/10 06:29

なるほど,正解率を起算してみると確かに上記の問題が生じていそうです. そこで質問に追記2として記載したのですが,同じクラスのペア・違うクラスのペアを約1:1にして実行した結果です. 途中から単調なグラフになっていますが,これはエポックを30くらいで止めてしまえばいいのでしょうか.
guest

回答2

0

同じクラスのペア,違うクラスのペアの割合は1:23くらいの割合

学習後に、valデータを真値が「同じクラス」と「違うクラス」に分けて、それぞれでaccuracy(正解率)を計算してみてください
それでもし、多いサンプルは正解率めちゃ高いけど、少ないサンプルは正解率ダメダメなら、

同じ割合でペアを生成する必要がある

となります

参考
不均衡データの分類問題
不均衡データに対するClassification

 
以上が、質問の「追記2」の「同じクラス・違うクラスでほぼ同じ割合でペアを作成」の理由です

投稿2022/07/29 01:57

編集2022/07/29 02:09
jbpb0

総合スコア7653

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

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

guest

0

ベストアンサー

lossだけが下がるのであれば過学習でしょう

投稿2022/07/06 07:09

_Victorique__

総合スコア1392

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

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

harug

2022/07/07 08:31

ご指摘ありがとうございます. バッチサイズを128に変更した結果を,質問内容に追記しました. こちらの結果からは,loss,accuracyが4つとも一定であるように見えますが,過学習を起こしている状態とはまた違った状態なのでしょうか.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問