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

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

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

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

Python

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

Q&A

解決済

2回答

1322閲覧

kerasでモデルを随時学習させながら予測させたい

AIthon

総合スコア76

Keras

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

Python

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

0グッド

1クリップ

投稿2019/06/22 09:22

python3.6上でkerasを用い、ニューラルネットワークを用いたプログラムを書いています。

###症状

AIが予測した結果に対して正しい値を人間が入力し、そのデータをもとにAIが予測する、、、
ということを繰り返してモデルを学習させるプログラムを書いているのですがうまくいきません。

プログラムは大雑把に書くと以下のようになります

python

1# モデルの定義 2model = Sequential() 3 4model.add(Dense(20, activation='sigmoid')) 5model.add(Dropout(0.2)) 6 7model.add(Dense(20, activation='sigmoid')) 8model.add(Dropout(0.2)) 9 10model.add(Dense(3, activation='sigmoid')) 11 12model.compile(loss='mean_squared_error', optimizer=Adam(lr=1e-3), metrics=['accuracy']) 13 14while ~~: 15 # モデルの学習 16 model.fit(x, y, batch_size=1, epochs=1, verbose=0) 17 18 # モデルを使って予測する 19 answer = model.predict_on_batch(data) 20 21 # 予測結果の表示と正しいデータの入力処理等

上のようにして、学習と予測を繰り返させようとしています。実行してみると、エラーは表示されないのですが、何回正しい値を入力してwhile文を回しても同じ値が予測値として返ってきます。感覚的に一回目に学習させたデータしか反映されていない気がします。自分でプログラムを見た限りモデルにデータを渡す処理に間違いはありませんでした。

###回答してもらいたいこと
kerasを用いてニューラルネットワークのモデルの学習と予測を繰り返す方法を教えてください。
上のコードと関係なくても大丈夫です。
また、コードに間違いがあればそれも指摘してもらえれば幸いです。
プログラミングもteratailも初心者なので色々と間違いがあったり情報不足だったりするかもしれません。遠慮なく指摘していただけると嬉しいです。

補足情報

OS: Ubuntu18.10
Python: 3.6.8
tensorflow: 1.13.1
keras: 2.2.4

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

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

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

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

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

guest

回答2

0

ベストアンサー

感覚なのですが、学習→予測→評価ではなく、予測→評価→学習なのではないでしょうか。

個人的に思った、手書き数字認識で随時学習させるコードは、こんな感じです。

python

1 2###モデルの事前学習 3 4from keras.datasets import mnist 5from keras.models import Sequential 6from keras.layers.core import Dense, Dropout, Activation 7from keras.optimizers import Adam 8from keras.utils import np_utils 9 10def build_model(): 11 # モデルの作成 12 model = Sequential() 13 model.add(Dense(512, input_shape=(784,))) 14 model.add(Activation('relu')) 15 model.add(Dropout(0.2)) 16 17 model.add(Dense(512)) 18 model.add(Activation('relu')) 19 model.add(Dropout(0.2)) 20 21 model.add(Dense(10)) 22 model.add(Activation('softmax')) 23 24 # 損失関数の定義 25 model.compile( 26 loss='categorical_crossentropy', 27 optimizer=Adam(), 28 metrics=['accuracy']) 29 30 return model 31 32if __name__ == "__main__": 33 # MNISTのデータの読み込み 34 (X_train, y_train), (X_test, y_test) = mnist.load_data() 35 X_train = X_train.reshape(60000, 784).astype('float32') 36 X_test = X_test.reshape(10000, 784).astype('float32') 37 X_train /= 255 38 X_test /= 255 39 40 # 10次元配列に変換 //数字の5ならこんな感じ[0,0,0,0,1,0,0,0,0,0] 41 y_train = np_utils.to_categorical(y_train, 10) 42 y_test = np_utils.to_categorical(y_test, 10) 43 44 # 訓練 45 model = build_model() 46 model.fit(X_train, y_train, 47 epochs=1, 48 batch_size=12800, #意図的に精度を下げている 49 validation_data=(X_test, y_test) 50 ) 51 52 # モデルの評価を行う 53 score = model.evaluate(X_test, y_test, verbose=1) 54 55 print('loss=', score[0]) 56 print('accuracy=', score[1]) 57 58 59 60###モデルの随時学習(オンライン学習) 61 62import numpy as np 63 64#while文でも可、一応データセットの関係上for文で 65for i in range(2000): 66 #予測 67 class1 = model.predict(X_test[i:i+1], batch_size=1) 68 print('予測:'+ str(np.argmax(class1))) 69 70 #このタイミングで正しい値を入力する(このコードではy_testを使っているが) 71 print('実際:'+ str(np.argmax(y_test[i]))) 72 73 #予測値と実際の値を評価 74 if np.argmax(class1)!=np.argmax(y_test[i]): 75 #予測と実際が一致しなかったとき、実際の値を教師データとしてモデル更新 76 model.fit(X_test[i:i+1], y_test[i:i+1]) 77 print('fitしました') 78 79print('終了') 80 81#事前学習時と同じテストデータでスコアを取ってみる 82score = model.evaluate(X_test, y_test, verbose=1) 83 84#随時学習を行う前と比べて精度はやや上昇する(モデルの中身が変化している) 85print('loss=', score[0]) 86print('accuracy=', score[1])

参考記事(コードの事前学習部分):https://ai-coordinator.jp/mnist

コード実行結果から、随時学習を行って精度が上昇するかどうかは断言できませんが、少なくともスコア結果は変わるので学習していると言えなくもないでしょう。

これをもとに質問者さんのコードを変えるならこんな感じかと。

python

1while ~~: 2  #入力が事前に与えられる 3  data=1   4 5 # モデルを使って予測する 6 answer = model.predict_on_batch(data) 7 8 # 予測結果の表示と正しいデータの入力処理等 9 print(answer) 10  valid_data=input('正しいデータ:') 11 12 # モデルの学習 13 if answer!=valid_data: 14 model.fit(data, valid_data, batch_size=1, epochs=1, verbose=0) 15 16 #次のループへ

具体的なコードがないのでこういった推測しかできませんが、参考になれば幸いです。

また、随時学習させることを「オンライン学習」とも呼ぶらしいので、そういった単語で調べると有用な情報が見つかるかもしれません。

投稿2019/07/10 12:43

amahara_waya

総合スコア1029

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

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

AIthon

2019/07/10 12:46

ありがとうございます!本当に役立ちました!
guest

0

https://github.com/keras-team/keras/issues/1868このページを見て無理やり自己解決しました。
とは言っても、 model.save("filename.h5")でモデルを保存したあと、 load_model("filename.h5")でモデルを再読込、そしてmodel.fit()で学習を繰り返すという強引なやり方です。いちいち保存してまた読み込むのでめちゃくちゃ重いです。誰か他の解決方法を知っている方は教えていただけると嬉しいです。

投稿2019/07/09 12:19

AIthon

総合スコア76

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問