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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

CNN (Convolutional Neural Network)

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

706閲覧

CNNのトレーニングデータの精度を良くしたい

semisemi

総合スコア18

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

CNN (Convolutional Neural Network)

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/09/28 09:08

編集2022/09/29 05:22

CNNを用いた分類を行っているのですが、トレーニングデータよりもテストデータのほうが精度が高くトレーニングデータの学習の進み方があまりよくありません。
これは、学習回数の問題とトレーニングデータの数の問題なのでしょうか。
以下が結果のグラフになります。

イメージ説明
図1 accuracyの精度グラフ
イメージ説明
図2 lossの精度グラフ
イメージ説明
図3 ドロップアウト0のaccuracyの精度グラフ
イメージ説明
図4 ドロップアウト0のlossの精度グラフ
イメージ説明
図5 ドロップアウト0.25で250で学習率1/10, 375でさらに1/10のaccuracy
イメージ説明
図5 ドロップアウト0.25で250で学習率1/10, 375でさらに1/10のloss

実現したいこと

・トレーニングデータの精度を良くしたい

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

トレーニングデータよりテストデータの方が精度が高く、トレーニングデータの学習の進みが遅い。

該当のソースコード(層の部分)

python

1from tensorflow.python.keras.models import Sequential 2model = Sequential() 3 4from tensorflow.python.keras.layers import Conv2D 5model.add( #畳み込み 6 Conv2D( 7 filters=8, #出力 8 input_shape=(50,50,3), 9 kernel_size=(3,3), #フィルタサイズ 10 strides=(1,1), 11 padding='valid', 12 activation='relu' 13 ) 14) 15 16from tensorflow.python.keras.layers import MaxPooling2D 17from tensorflow.python.keras.layers import Dropout 18 19model.add(MaxPooling2D(pool_size=(2,2))) #マックスプーリング # 20 21#追加畳み込み 22model.add( 23 Conv2D( 24 filters =16, 25 kernel_size = (3,3), 26 strides = (1,1), 27 padding = 'valid', 28 activation = 'relu' 29 )) 30 31model.add(MaxPooling2D(pool_size=(2,2))) 32 33#追加畳み込み 34model.add( 35 Conv2D( 36 filters = 32, 37 kernel_size = (3,3), 38 strides = (1,1), 39 padding = 'valid', 40 activation = 'relu' 41 )) 42 43model.add(MaxPooling2D(pool_size=(2,2))) 44 45#追加畳み込み 46model.add( 47 Conv2D( 48 filters = 64, 49 kernel_size = (3,3), 50 strides = (1,1), 51 padding = 'valid', 52 activation = 'relu' 53 )) 54 55model.add(MaxPooling2D(pool_size=(2,2))) 56 57from tensorflow.python.keras.layers import Flatten 58model.add(Flatten()) #2次元配列に 59 60from tensorflow.python.keras.layers import Dense 61 62model.add(Dense(units=192 63 ,activation='relu')) #全結合 64 65model.add(Dropout(0.5)) 66model.add(Dense(units=3,activation='softmax',name="f3")) #全結合 67 68# 追加の学習率減衰 69def step_decay(epoch): 70 x = 0.001 71 if epoch >= 250: x = 0.0001 72 if epoch >= 375: x = 0.00001 73 return x 74lr_decay = LearningRateScheduler(step_decay) 75 76 77model.compile( 78 optimizer=Adam(), #自動で学習率が設定される 79 loss='categorical_crossentropy', #多分類のときにしていできる交差エントロピー 80 metrics=['accuracy'] 81) #全結合 82 83history_model = model.fit_generator( 84 x_train_generator, 85 epochs = 10, 86 validation_data = val_test_generator, 87 validation_steps = None, 88 shuffle = True, 89 callbacks=[lr_decay] 90 )

データの詳細

トレーニングデータには三種類の画像が入っており、それぞれ7256, 8356, 4720合計すると20332程のデータ数があります。
対してテストデータには、それぞれ716,2089,550の計3335程のデータ数があります

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

windows10(64bit)
anacondaを使用
python 3.8.13
TensorFlow 2.3
Spyder 5.3.1を利用

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

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

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

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

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

jbpb0

2022/09/28 10:04

Dropout(0.5)の数値を小さくしたら、どうなりますでしょうか?
semisemi

2022/09/28 10:11

質問ありがとうございます。 数値を小さくとは0.3程の数字で良いでしょうか。
jbpb0

2022/09/29 02:42 編集

どれくらいがいいのかは、やってみないと分からないです 0.1〜0.3くらいに適当に変えてみて、傾向としてどうなるのかを見て、望ましい方向に変われば、さらに数値を変えてみる あるいは、ドロップアウトを無くしたらどうなるか、を確認する val(test)があまり変わらずtrainが良くなればいいですが、逆にtrainがあまり変わらずval(test)が悪化することもあるので
meg_

2022/09/28 12:48

トレーニングデータとテストデータで四種類の画像の割合はほぼ同じですか?
jbpb0

2022/10/03 03:33

> トレーニングデータには三種類の画像が入っており、それぞれ7256, 8356, 4720合計すると20332程のデータ数があります。 対してテストデータには、それぞれ716,2089,550の計3335程のデータ数があります トレーニングデータの三種類の画像の数は近いですが、テストデータは二種類目の画像の数(2089)が他と比べて多いので、2089を半分の1000くらいに減らしてみたら、いかがでしょうか?
guest

回答1

0

ベストアンサー

一般的に使われるCNNに対して,上述のモデルは入力層側のフィルタの枚数が少ないように感じます.解像度28x28のLeNetでは6枚ですがResNetなどのDNNでは序盤から64枚のフィルタを持つなど,モデルの高性能化を要求するとフィルタの枚数も必然的に増えます.今回はまだモデルの性能に納得がいっていないということだったので,フィルタの枚数を増やすのが妥当だと考えられます.

また,他のパラメータも改善の余地があります.リファレンスを参照するとわかるのですが,Conv2D()の重み初期値kernel_initializerはデフォルトで,活性化関数をtanh()にしたとき用のglorot_uniformが設定されています.それに対して,活性化関数をReLU()にしたとき用のものとして設計されたhe_uniformを適用すると,学習速度が速くなることが知られています.

もちろん,平滑化Flatten()した後の全結合層Dense()でも設定できるパラメータです.

もし,フィルタ数を増やして過学習を起こすのであれば,重み正則化項であるkernel_regularizerを設定するのも一手です.

更には,BatchNormalization()を利用することも学習速度を速くできる手法であることも知られています.活性化関数の直後に挿入すると良いでしょう.

また,学習率減衰にはLearningRateScheduler()も利用できますが,ReduceLROnPlateau()の方が動的に学習率を減衰させることができて便利です.リファレンスを参考に実装してみると良いでしょう.

投稿2022/10/04 22:40

編集2022/10/04 22:46
PondVillege

総合スコア1579

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問