Translate

#83 トレーニングされたモデルを使用する

 最後に、体験したトレーニング済みモデルを使って、ある1個の画像に対する予測を行ってみましょう。




1.予測する画像の選択

テスト用データセットの2番目の画像を選択します。

念のため、選んだ『test_image[1]』の縦・横のピクセル数を確認してみると、縦28ピクセル × 横28ピクセルで、トレーニング済みモデルで予測することが可能であることが確認できました。


この確認作業は、予測をする際に重要です。今回は、同じデータセットをトレーニング用とテスト用に分割したので、縦・横のピクセル数が揃っていることはわかっていますが、実際の場面では、予測用の新たなデータを使うことが多いので、このような確認作業をルーティンにしていきましょう。


2.予測する画像の目視

選んだ画像がどんなものか、Section 4『データの前処理』のところで書いたコードを活用して、実物を見てみます。





3.予測する画像の前処理

今回のKeras のモデルは、『3次元テンソル』 を予測するように作ってきました。そのため、内部では常に『3次元テンソル』のデータを待ち受けています。

もし、次元を追加せずに1枚の画像を probability_model.predict(img) に渡してしまうと、モデルは「データの形が違う!」とエラーを起こしてしまいます。

そのため、「1枚だけの画像だけど、形の上では『枚数が1のデータの塊』ですよ」と見せかけるために、『np.expand_dims』を使って先頭に次元を追加します。




『np.expand_dims(配列, 軸の番号)』は、指定した位置に、長さ「1」(すなわち枚数が1)の新しい次元(軸)を追加する NumPy の関数です。


4.予測結果 

さて、予測するデータの次元を『3次元テンソル』 にできたところで、予測をしてみましょう。





上記の結果は直感的にわかりにくいので、『f文字列』を使って、通常の小数に変換してみます。

この際、『for p in predictions_single:』でループを回すと、エラーが出てしまいます。

この原因は、『predictions_single』が、2次元の配列(形が (1, 10))になっているためです。

先ほどのステップで『np.expand_dims()』を使って画像にバッチの次元を追加したため、予測結果である 『predictions_single』も先頭に次元がついた状態になっています。

1枚目の画像に対する10個の確率を取り出すには、『predictions_single[0]』と指定して、インデックスの次元を剥がす(1次元の配列にする)必要があります。





5.予測結果の図示

結果を、わかりやすいようにグラフにしてみます。

『Section 8 予測結果の図示と検証』で、定義した棒グラフの関数を使い、X軸の目盛りを数字から具体的な『衣類の名前(クラス名)』に変更する処理を行います。




1行目:前セクションで自作した関数『plot_value_array』を呼び出しています。インデックス1のテスト画像に対する予測確率の棒グラフを描画する準備をしています。

2行目:
range(10): X軸の目盛りの位置(0から9までの10箇所)を指定します。
class_names: グラフのX軸に表示される数字(0, 1, 2...)を、あらかじめ用意されているクラス名のリスト(T-shirt/top, Trouserなど)に置き換えます。
rotation=45: クラス名同士の文字が重なって見にくくならないように、ラベルを45度斜めに回転させて表示します。

3行目:グラフを表示します。


6.予測結果のラベル表示

予測した結果の中で、最も確率の高いラベルを表示します。




ラベルは、『2』ですから、『Pullover(頭からかぶって着用する服)』と予測されました。


**********

★今回、体験したコード

# 予測する画像の選択

img = test_images[1]
print(img.shape)

# 予測する画像の目視

plt.figure()
plt.imshow(test_images[1])
plt.colorbar()
plt.grid(False)
plt.show()

# 予測する画像の前処理_次元を追加

img = (np.expand_dims(img,0))
print(img.shape)

# 予測結果_1

predictions_single = probability_model.predict(img)
print(predictions_single)

# 予測結果_2

for p in predictions_single[0]:
    print(f"{p:.4f}")

# 予測結果の図示

plot_value_array(1, predictions_single[0], test_labels)_ = plt.xticks(range(10), class_names, rotation=45)
plt.show()

# 予測結果のラベル表示

np.argmax(predictions_single[0])

**********

さて、ディープラーニングの体験はいかがでしたか?

Keras自体は、そんなに難しくなかったのではないでしょうか?Kerasはすごいですね。

画像の図示が少し難しいので、Google Colaboratoryの付属のGeminiの活用をお勧めします!





コメント