1. Neural NetworkとTensorflowについて
  2. 画像の処理について
  3. CNNの学習(Keras)について
    1. CNNに学習させてモデルを保存する
    2. 保存した学習したモデルを使って予測を行う(今回記事)
  4. Google Colabについて
  5. AutoKerasについて

数字を認識するConvolutional Neural Network (CNN)をkerasで作っていきます。前回の記事では自分で用意した学習用の画像を、CNNに学習させて学習させたモデルを保存しました。今回は、保存したモデルを読み込んで予測します。

Jupyternotebookを使用します。

さっそく前回保存したh5ファイルを読み込んで、モデルの形をみてみます。

from tensorflow.keras.models import load_model

model = load_model(r"C:\Users\my_model.h5")
model.summary()
Layer (type)Output ShapeParam #
conv2d (Conv2D)(None, 140, 290, 32)11648
activation (Activation)(None, 140, 290, 32)0
max_pooling2d (MaxPooling2D)(None, 70, 145, 32)0
conv2d_1 (Conv2D)(None, 68, 143, 64)18496
activation_1 (Activation)(None, 68, 143, 64)0
max_pooling2d_1 (MaxPooling2D)(None, 34, 71, 64)0
flatten (Flatten)(None, 154496)0
dense (Dense)(None, 514)79411458
activation_2 (Activation)(None, 514)0
dropout (Dropout)(None, 514)0
dense_1 (Dense)(None, 10)5150
activation_3 (Activation)(None, 10)0

保存する前と全く同じ形がでてきました。うまくいってそうです。

このモデルを使って、1枚の画像を予測してみたいと思います。

予想したい画像を1枚読み込んでみます。CNNに読み込ませるために、numpy arrayの形にします。最後に、array_to_imgで実際の画像を見てみます。

from tensorflow.keras.preprocessing.image import load_img, img_to_array,array_to_img
import numpy as np

img_rows = 150 # 縦ピクセル
img_cols = 300 # 横ピクセル

# classlist = ["0","1","2","3","4","5","6","7","8","9"]

X_trial = []
img = load_img(r"C:\Users\1\1.jpg",
               target_size=(img_rows,img_cols))
x = img_to_array(img)
x = x.astype('float32')
x = x/255 # scaling

X_trial.append(x)
X_trial = np.array(X_trial, dtype='float') 

array_to_img(X_trial[0])

1です。縦と横のアスペクト比を間違えてしまいました。でも、CNNに学習させた画像もこのアスペクト比なので同じままにします。パソコンには関係ないでしょう!!

読み込んだモデルで予想するには、predictを使います。各クラスの確率が示されます。

pred = model.predict(X_trial)
print(pred)
[[1.4910665e-08 9.9999964e-01 1.0234755e-08 1.3214522e-07 4.7703184e-09
  6.2747723e-09 9.2011391e-08 6.2187524e-08 6.1568672e-10 1.0476766e-08]]

よくわからないので、roundします。

print(np.round(pred,decimals=1))
[[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]

確率が最大のインデックスを取るには、以下のコードです。
np.argmax(pred)
1

予想カテゴリは[“0″,”1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9”]なので、インデックス1は、”1”を示しています。正解です。

今度は4を予想します。

pred = model.predict(X_trial)
print(np.round(pred,decimals=1))
print(np.argmax(pred))
[[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]] 
4

うまく予想できていますね!

Categories:

category