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

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

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

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

深層学習

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

Python

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

Q&A

解決済

1回答

1614閲覧

kerasによる画像認識で検証データの損失関数を減らしたい

python55

総合スコア3

Keras

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

深層学習

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

Python

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

0グッド

0クリップ

投稿2020/08/05 14:41

編集2020/08/14 03:54

実現したいこと

損失関数を減らす
グラフを安定させる

発生している問題

イメージ説明
イメージ説明

import keras from keras.models import Sequential from keras.layers import Activation,Dense,Flatten,Dropout from keras.layers import Conv2D,MaxPooling2D from keras.preprocessing.image import ImageDataGenerator import matplotlib.pyplot as plt from keras import layers, models def main(): model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=(64,64,3)))# レイヤー1 model.add(Activation('relu')) model.add(Conv2D(32, (3, 3))) # レイヤー2 model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.5)) model.add(Conv2D(64, (3, 3))) # レイヤー3 model.add(Activation('relu')) model.add(Conv2D(64, (3, 3))) # レイヤー4 model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.5)) model.add(Flatten()) # レイヤー5 model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(2)) # レイヤー6 model.add(Activation('softmax')) model.compile( optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"]) train_datagen=ImageDataGenerator(rescale=1./255) test_datagen=ImageDataGenerator(rescale=1./255) train_generator=train_datagen.flow_from_directory( "data/train", target_size=(64,64), batch_size=10) validation_generator=test_datagen.flow_from_directory( "data/vallidation", target_size=(64,64), batch_size=10) model.fit_generator( train_generator, epochs=100, steps_per_epoch=15, validation_data=validation_generator, validation_steps=15 ) accuracy= model.history.history['accuracy'] val_accuracy = model.history.history['val_accuracy'] loss= model.history.history['loss'] val_loss = model.history.history['val_loss'] epochs = range(len(accuracy)) plt.plot(epochs, accuracy, '-o', label='Training acc') plt.plot(epochs, val_accuracy, '-o', label='Validation acc') plt.title('Training and validation accuracy') plt.legend() plt.show() plt.savefig('a') plt.figure() plt.plot(epochs, loss, '-o', label='Training loss') plt.plot(epochs, val_loss, '-o', label='Validation loss') plt.title('Training and validation loss') plt.show() plt.savefig('b') if __name__== "__main__": main()

試したこと

Dropout関数を変更してみた
epochs数を多くしてみた
どのようにすれば損失関数は小さくなるのでしょうか?
教えていただけると幸いです。

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

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

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

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

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

meg_

2020/08/05 22:18

・コードは「コードの挿入」で記入してください。 ・早期終了してみてはどうでしょうか?
python55

2020/08/06 04:26

すみません、次回からそうしていきたいと思います。 epoch数を減らすということでしょうか?
meg_

2020/08/06 05:54

今からでも直した方が有識者からの回答が付きやすくなるかと思いますが。インデントのないコードは読む気が起こらない方も多いですよ。 過学習については"EarlyStopping"で調べてみてください。
python55

2020/08/06 11:25

そうですね。ご意見いただきありがとうございます。 今から直したいと思います。
guest

回答1

0

ベストアンサー

安定させたい対象はVal Lossということですよね?
過学習しているということが言いたいのでしょうか?(この情報だけでは過学習かどうかも判断が難しいと思いますが…

もう少し結果を可視化して確認することをお勧めします。
手始めに以下の項目あたりどうでしょうか?

  1. lossだけでなくAccも確認する

Cross Entropyh Lossでは相対的な学習の進行はわかっても精度Accがどの程度かはわかりません。
もっと言うと正解したデータと間違えたデータを目視で確認すべきです、間違えたデータの特徴がわかれば改善の作戦が立てられます。

  1. TrainデータとValデータのサイズを確認する

Valデータサイズが小さい場合はエポックごとにLossが暴れることがあります。(Accで見れば安定している可能性もあるのでまずはAccを出して欲しいですが…)

上の情報がないと根拠を持って言えませんが、よくある過学習に対する常套手段は、
バッチサイズを上げて学習率を下げるという作戦です。
もしくはAugmentationなどの前処理を行い汎化させる方法です。

これらの使い分けは学習データの特性(データ数やばらつきなど)です。
なのでデータの特性と合わせて戦略を立てる必要があります。

重ねてのコメントになってしまいますが、データを確認することから始めてみてはいかがでしょうか。

投稿2020/08/13 15:01

msoniku

総合スコア36

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

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

python55

2020/08/14 03:54

msonikuさん、丁寧なご返答ありがとうございます。 ご指摘の通り、Accもグラフで出力しましたので発生している問題のところに追加いたしました。 再度質問させて頂きたいのですが、正解したデータと間違えたデータを目視で確認するというのはコードを書き換えてどのような画像を学習しているか確認するということでしょうか?
msoniku

2020/08/14 05:29

そうですね やり方はいろいろありますが、単純な方法だと、Valデータを入力して推論した結果(画像ごとに正解だったか失敗だったか)を出力するなどでしょうか。(このとき入力画像をシャッフルすると予測結果の成否と対応が付かなくなるので注意) Accのグラフありがとうございます。 思ったよりも過学習していないですね。過学習するともっとVal Accが下ります。 個人的な印象としては、まだ精度上がりそうですね、もう少しEpoch増やして見てください。
python55

2020/08/17 02:32

再度、ご丁寧な返答ありがとうございます。 参考にさせていただき、精度を上げていきたいと思います。 また、機会があれば質問させてください。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問