学習したモデルに学習データを与えて認識させて(予測して)みよう.(なお予測精度が100%なので,必ず正解するはずです.)モデルの予測は model.predict
を呼び出すだけで可能です.
認識する (08-predict-train.py)
import numpy as np
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense
# ファイルを開いて読み込む
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)
# 予測結果の表示
print(pred_train)
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 760us/step - loss: 2.3165 - accuracy: 0.1000 Epoch 2/30 80/80 [==============================] - 0s 50us/step - loss: 1.7889 - accuracy: 0.4750 ...(中略)... Epoch 30/30 80/80 [==============================] - 0s 224us/step - loss: 0.0308 - accuracy: 1.0000 [[3.49598099e-03 3.46307825e-05 2.75497674e-04 9.94985342e-01 1.91958225e-06 2.87095289e-04 1.70852858e-04 1.02151651e-04 8.14100931e-05 5.65260823e-04] [9.97250021e-01 1.07124624e-05 1.19850898e-04 2.13782163e-03 3.35218101e-06 4.33974346e-05 2.67493888e-05 7.44683784e-05 1.49398300e-04 1.84223303e-04] ...(中略)... [3.49536426e-02 2.37612228e-04 2.83325859e-03 2.82238098e-03 5.34147141e-04 2.51164008e-03 1.18059767e-02 4.63082339e-04 9.38915074e-01 4.92324959e-03]]
結果の最初の10個の値 [3.49598099e-03 3.46307825e-05 ... 5.65260823e-04] は1つ目の数字が「0」である確率が 0.00349,「1」である確率が 0.0000346 ... であることを意味しています.つまり,これらの中での最大値を探すと,99.49%の確率で「3」であると認識されたことになります.
同様に,2番目の数字は99.72%の確率で「0」,最後の数字は93.89%の確率で「8」であると認識されています.
なお,データの作成時に並び順をランダムにシャッフルしているので,結果は必ずしも一致しないことに注意してください. 次のページでは,認識結果,正解ラベルと画像のイメージも表示してみよう.