感覚なのですが、学習→予測→評価ではなく、予測→評価→学習なのではないでしょうか。
個人的に思った、手書き数字認識で随時学習させるコードは、こんな感じです。
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:46