次は,他の数字の認識結果も自由に表示できるように改良してみよう.input()
関数によってキーボードからの入力を受け付けることができるので,認識させてい数字の番号を入力して実行させてみると良いでしょう.-1を入力すると認識を終了します.また,数字以外の文字列を入力したときにプログラムが強制終了してしまわないように,try
とexcept
によって例外処理を行っています.
認識させる (10-predict-train.py)
import numpy as np
from keras.utils.np_utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense
def print_train_predict(idx):
print('認識結果 :', np.argmax(pred_train[idx]))
print('正解ラベル:', np.argmax(y_train[idx]))
# トレーニングデータの表示
i = 1
for x in x_train[idx]:
if (x == 1):
print("+ ", end="")
else:
print(" ", end="")
if i % 15 == 0:
print("")
i += 1
# ファイルを開いて読み込む
x_train = np.load('train_X_data.npy')
y_train = np.load('train_Y_data.npy')
x_test = np.load('test_X_data.npy')
y_test = np.load('test_Y_data.npy')
# 正解ラベルを one-hot-encoding にする
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# モデルを作る
model = Sequential()
model.add(Dense(128, activation='relu', input_dim=225)) # input_dim = 15 x 15 = 225
model.add(Dense(10, activation='softmax'))
# モデルをコンパイルする
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.summary()
# 学習してみよう(このコードだけで,学習状況も表示される)
model.fit(x_train, y_train,
batch_size=20,
epochs=30,
verbose=1)
# 認識してみよう
pred_train = model.predict(x_train)
while True:
print('---------------------')
print('予測結果を表示したい学習データの番号(0 から', x_train.shape[0]-1 ,'まで)を入力してください(-1で終了します):', end="")
str_idx = input()
# 空の場合の処理
if str_idx == "":
print('入力してください')
continue
# 入力した文字列を整数に変換するが,変換できない場合のために例外処理が必要
try:
idx = int(str_idx)
except ValueError:
print('エラー:数字以外の文字は入力できません')
continue
# 終了判定
if idx == -1:
break
if idx < 0 or idx > x_train.shape[0]-1:
print('正しい値を入れてください')
continue
print_train_predict(idx)
print('------ 終了しました ------')
Using TensorFlow backend. Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_1 (Dense) (None, 128) 28928 _________________________________________________________________ dense_2 (Dense) (None, 10) 1290 ================================================================= Total params: 30,218 Trainable params: 30,218 Non-trainable params: 0 _________________________________________________________________ Epoch 1/30 80/80 [==============================] - 0s 985us/step - loss: 2.2976 - accuracy: 0.2125 Epoch 2/30 80/80 [==============================] - 0s 87us/step - loss: 1.7160 - accuracy: 0.5875 ...(中略)... Epoch 30/30 80/80 [==============================] - 0s 112us/step - loss: 0.0269 - accuracy: 1.0000 --------------------- 予測結果を表示したい学習データの番号(0 から 79 まで)を入力してください(-1で終了します):1 ⏎ 認識結果 : 0 正解ラベル: 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --------------------- 予測結果を表示したい学習データの番号(0 から 79 まで)を入力してください(-1で終了します):2 ⏎ 認識結果 : 4 正解ラベル: 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --------------------- 予測結果を表示したい学習データの番号(0 から 79 まで)を入力してください(-1で終了します):3 ⏎ 認識結果 : 3 正解ラベル: 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --------------------- 予測結果を表示したい学習データの番号(0 から 79 まで)を入力してください(-1で終了します):4 ⏎ 認識結果 : 7 正解ラベル: 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --------------------- 予測結果を表示したい学習データの番号(0 から 79 まで)を入力してください(-1で終了します):-1 ⏎ ------ 終了しました ------
なお,データの作成時に並び順をランダムにシャッフルしているので,表示されるデータは必ずしも一致しません.次は,テストデータでも予測してみよう.