Python入門トップページ


手書き数字を認識するAIを作ってみよう : 目次

  1. 画像データの準備と確認
  2. 画像データを読み込んでみよう
  3. 画像データの一覧を読み込んでみよう
  4. 学習データとテストデータを準備する
  5. 保存したデータを開いてみる
  6. モデルを作る
  7. 学習(トレーニング)させてみよう
  8. モデルを評価しよう
  9. 学習データで認識させてみよう(1)
  10. 学習データで認識させてみよう(2)
  11. 学習データで認識させてみよう(3)
  12. テストデータで認識させてみよう
  13. モデルと重みパラメータを保存しよう
  14. 学習済みモデルをロードしよう
  15. 学習済みモデルをロードして,認識してみよう

学習データで認識させてみよう(1)

学習したモデルに学習データを与えて認識させて(予測して)みよう.(なお予測精度が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」であると認識されています.

なお,データの作成時に並び順をランダムにシャッフルしているので,結果は必ずしも一致しないことに注意してください. 次のページでは,認識結果,正解ラベルと画像のイメージも表示してみよう.

目次に戻る