代码从 https://tensorflow.google.cn/tutorials/keras/classification 搬移
改了一下输入的构造 (仅是一个 demo 输入构造简化了很多)
代码中使用 图像数据下载链接 https://download.csdn.net/download/zslngu/16165364
最终的结果
文章目录
-
-
- 1. 输入准备
- 2. 格式化输入
- 3. 构建 model
- 4. 预测
- 5. 完整的模型相关代码
-
1. 输入准备
首先拿到 0~9 数字的图片,清理成下面这种格式
数字 0 示例 (文件暂时命名为 0.model)
01111110
01111111
11100111
11100011
11100011
11000011
11100011
11100011
11100111
01111110
01111110
因为是 demo 所以简单构造一下输入 将所有数字的图形信息都复制一下
def copy_data():
l = [str(i) for i in range(0, 10)]
for ll in l:
path = "./tf/" + str(ll) + ".model"
with open(path, "r") as f:
cur = f.read()
for j in range(0, 15):
# s_path ex: 0_1.model 生成15个一样的输入
s_path = "./tf/" + str(ll) + "_" + str(j) + ".model"
with open(s_path, "w") as wf:
wf.write(cur)
这样一共生成 10 * 15 个图像数据
2. 格式化输入
代码引用的库 & 环境配置
import os
model_path = "代码根目录"
os.chdir(model_path)
import cv2
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras
将原始内容可视化
trains = []
labels=[]
def get_train(path):
with open(path, "r") as f:
cur = f.read()
lines = cur.split("\n")
strs = [list(l) for l in lines]
return np.array(strs, dtype='uint8')
for file in os.listdir("."):
if file.find("_") == -1:
continue
trains.append(get_train(file))
labels.append(file.split("_")[0])
plt.figure(figsize=(10,10))
for i in range(10):
m = get_train(str(i) + '.model')
plt.subplot(5, 5, (i + 1))
plt.imshow(m)
plt.xticks([])
plt.yticks([])
plt.xlabel(str(i))
结果如下:
获取 训练集合 和 标签集合
for file in os.listdir("."):
if file.find("_") == -1:
continue
trains.append(get_train(file))
labels.append(file.split("_")[0])
3. 构建 model
# 这些层 & 优化 & 损失函数 是官网源文档的配置
models = keras.Sequential([
keras.layers.Flatten(input_shape=(11, 8)),
keras.layers.Dense(128, activation="relu"),
keras.layers.Dense(10)])
models.compile(
optimizer = 'adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy']
)
训练
4. 预测
构建预测的model
#SoftMax 将预测结果转为概率
predict_model = tf.keras.Sequential([models, tf.keras.layers.Softmax()])
预测 可以看到预测为数字0的概率为0.81
get_train("0.model")
predict_model.predict(np.array([get_train("0.model")]))
再用 9 看一下
5. 完整的模型相关代码
import os
import cv2
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras
model_path = "./tf" # 所有的图形信息文件放在代码同目录 tf文件夹下 后缀名为.model
os.chdir(model_path)
trains = []
labels=[]
def get_train(path):
with open(path, "r") as f:
cur = f.read()
lines = cur.split("\n")
strs = [list(l) for l in lines]
return np.array(strs, dtype='uint8')
for file in os.listdir("."):
if file.find("_") == -1:
continue
trains.append(get_train(file))
labels.append(file.split("_")[0])
models = keras.Sequential([
keras.layers.Flatten(input_shape=(11, 8)),
keras.layers.Dense(128, activation="relu"),
keras.layers.Dense(10)])
models.compile(
optimizer = 'adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy']
)
models.fit(np.array(trains), np.array(labels, dtype="uint8"), epochs=10)
predict_model = tf.keras.Sequential([models, tf.keras.layers.Softmax()])
if __name__ == '__main__':
tests = []
for i in range(10):
tests.append(get_train(str(i) + ".model"))
rs = predict_model.predict(np.array(tests))
for i in range(10):
print("数字 %s 预测为 %s 的概率为 %s" % (str(i), str(i), rs[i][i]))
结果: