トレーニング済みのモデル パラメーターを呼び出して、手書きの数字を予測します。
from PIL import Image
import numpy as np
import tensorflow as tf
model_save_path = './checkpoint/mnist.ckpt'
# 复现模型
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')])
# 加载模型权重
model.load_weights(model_save_path)
preNum = int(input("input the number of test pictures:"))
for i in range(preNum):
image_path = input("the path of test picture:")
img = Image.open(image_path)
# 重新定义输入大小,以便和训练的模型输入相同
img = img.resize((28, 28), Image.ANTIALIAS)
# 模型转灰度
img_arr = np.array(img.convert('L'))
# *********************图片预处理
img_arr = 255 - img_arr
"""
for i in range(28):
for j in range(28):
if img_arr[i][j] < 200:
img_arr[i][j] = 255
else:
img_arr[i][j] = 0
"""
# *********************图片预处理
# 归一化
img_arr = img_arr / 255.0
print("img_arr:", img_arr.shape)
# 升维度
# 为什么要升维度:由于predict是按照batch作为输入的,在这里batch是1,即我们输入的那张图片,所以应该要升维度1,且该维度在最前面
x_predict = img_arr[tf.newaxis, ...]
print("x_predict:", x_predict.shape)
result = model.predict(x_predict)
pred = tf.argmax(result, axis=1)
print('\n')
tf.print(pred)
コード内のいくつかのメモ:
画像はトレーニング済みのモデルをロードします。入力の形状を設定し、グレースケールに変換する必要があります。
# 訓練されたモデル入力と同じになるように入力サイズを再定義し、ANTIALIAS、つまりアンチエイリアシングを設定します
予測するときは、次の次元を増やす必要があります。
#次元を増やす理由:予測はバッチに従って入力されるため、ここではバッチが1、つまり入力した画像であるため、次元を1増やす必要があり、この次元が先頭にあります