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

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

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

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

Q&A

解決済

3回答

1686閲覧

kerasにおける深層学習の精度についてです。

Hayato1201

総合スコア220

Python

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

0グッド

1クリップ

投稿2018/02/18 12:33

編集2018/02/19 08:23

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
kerasを使いあるデータのクラス分類を行なっているのですが、エポックが進むごとにたまに精度が下がったりする事がありますがこれって普通に起こりえる事でしょうか?

以下のようにして、評価データをエポックごとに見ているのですが、突然精度が下がったりします。

model.fit(X_train, y_train, batch_size=100, verbose=1, epochs = epoch, validation_data = (X_test,y_test))

評価データの中からランダムにとってきてそれを評価しているならばたまたまとってきたところが学習できていないタイプのデータだったりすることによってこういうことが起きているのかとも思いますがどうなんでしょうか?
________________________________________________
追記です。

回答ありがとうございました。
データの表示やコールバック等はすでに使用しています。しかし後半精度がガクッと落ちてしまったりということがありました。ここで思ったのは評価データに偏りがあり、後半の評価データには教師データの数が少ないものが集中しており、それが原因かとも思ったのですが、validation_data = (X_test,y_test))となっている部分で、これが評価データに当たるのですが、毎エポックごとにこれはランダムに評価データをとってきているのでしょうか?そうだとしたら評価データの偏りは問題にならないし、モデルやパラメータの方に問題があるのかもしれませんが・・・
また、kerasの根本的な質問ですが、評価データに限らず、教室データの方も、バッチの数だけ毎回ランダムに使って学習しているのでしょうか?それともバッチ数100なら教師データ上から100、次はその次の100、という様にはなっていませんか?
________________________________
さらに追記です。

doropoutやbatchnormなどは使用して現在こんな感じです。イメージ説明

徐々に精度が下がってしまっています。。。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/02/19 04:14

学習データの精度と訓練用の精度をepochごとにプロットしてみてください。典型的なoverfittingが起きていると思います。対策としては正則化を強める、dropoutを使うなどがあります。
退会済みユーザー

退会済みユーザー

2018/02/19 08:44

モデルの自由度が高すぎるように見えますね。層の数、ユニットの数を減らして試してみてください。ただし、具体的なデータとモデルで再現できるようにしない限りはあてずっぽうな回答しか得られないと思います。
guest

回答3

0

回答

これは一例(学習がうまくいっているパターン)ですが精度(accuracy)が一定のepoch毎に上がったり下がったりしますが全体の傾向として上昇傾向になるという例です。
ある一定区間(一定epoch数)だけをみると下がっているように見えるので「精度が下がったように見えた」という状況かもしれません。

イメージ説明
イメージ説明
Display Deep Learning Model Training History in Keras

対策

精度やロスが減少傾向になっているか確認するのはどうするのか、上記のように精度とロスをプロットすることです。便利なことにKerasは学習中の精度とロスを履歴記録してくれるので簡単にプロットすることができます。

python

1# 質問者様のコードを利用します 2# http://aidiary.hatenablog.com/entry/20161109/1478696865 より 3def plot_history(history): 4 # print(history.history.keys()) 5 6 # 精度の履歴をプロット 7 plt.plot(history.history['acc']) 8 plt.plot(history.history['val_acc']) 9 plt.title('model accuracy') 10 plt.xlabel('epoch') 11 plt.ylabel('accuracy') 12 plt.legend(['acc', 'val_acc'], loc='lower right') 13 plt.show() 14 15 # 損失の履歴をプロット 16 plt.plot(history.history['loss']) 17 plt.plot(history.history['val_loss']) 18 plt.title('model loss') 19 plt.xlabel('epoch') 20 plt.ylabel('loss') 21 plt.legend(['loss', 'val_loss'], loc='lower right') 22 plt.show() 23 24# model.fitの戻り値で学習履歴(Historyオブジェクト)を受け取れます 25history = model.fit(X_train, y_train, batch_size=100, verbose=1, epochs = epoch, validation_data = (X_test,y_test)) 26 27# 学習履歴をプロット 28plot_history(history)

参考

人工知能に関する断創録 - KerasでMNIST

学習履歴のプロット

fit()の戻り値である history に学習経過の履歴が格納されている。このオブジェクトを使えばいろいろな経過情報をプロットできる。デフォルトでは、loss(訓練データセットの損失)だけだが、modelのmetricsにaccuracyを追加するとacc(精度)が、バリデーションデータセットを使うとval_loss(バリデーションデータセットの損失)やval_acc(バリデーションデータセットの精度)が自動的に追加される。さっきの図はこのデータを使ってmatplotlibで書いた。ユーザ独自のメトリクスも定義できるようだ。

Keras - History

おまけ

ついでにKerasのCallbackあたりを調べておくとモデルの学習が捗ると思います。
特にEarlyStoppingModelCheckpointなんかがよく使うかなと。

Keras - callbaks

投稿2018/02/18 13:06

編集2018/02/18 13:31
wakame

総合スコア1170

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

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

0

ベストアンサー

学習方法・学習段階によっては十分に起こりうることです。。

単純な例ですと、学習率が大きすぎるために最適解を飛び越してしまうことで返ってエラーが大きくなることがあります。
学習方法で見ると、確率的勾配法は各ステップのランダム要素が大きいのでエラーが細かく上がったり下がったりします。ただ、少し長い区間で見ると全体的にエラーが下がって行きます(絶対ではありませんが)。

投稿2018/02/18 12:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

追加についてだけ

評価データはずっと同じなはずです。
でないと比較ができません。
教師データもたくさん必要ですが、評価値の分散を下げるために評価データもそれなりに必要です。

また、バッチサイズとエポックについて少し誤解があるのではないでしょうか。
バッチサイズを決める実用上の理由はメモリにデータを載せることにあることが多いです。
バッチサイズ100、データ数1000だと、1エポックにつき10個のバッチを取り出しています。
1エポックというのはデータを1回ずつ全部使ったことを言います。

またデータのシャッフルについてはオプションがあって、エポックごとにバッチ取り出しを選びなおすか定めることができます。デフォルトは真です。
評価データはシャッフルしても意味はありません。

投稿2018/02/19 00:35

編集2018/02/19 05:55
mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問