天天看点

tensorflow 图像分类 demo

代码从 https://tensorflow.google.cn/tutorials/keras/classification 搬移

改了一下输入的构造 (仅是一个 demo 输入构造简化了很多)

代码中使用 图像数据下载链接 https://download.csdn.net/download/zslngu/16165364

最终的结果

tensorflow 图像分类 demo

文章目录

      • 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))
           

结果如下:

tensorflow 图像分类 demo

获取 训练集合 和 标签集合

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']
)
           

训练

tensorflow 图像分类 demo

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")]))
           
tensorflow 图像分类 demo

再用 9 看一下

tensorflow 图像分类 demo

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]))


           

结果:

tensorflow 图像分类 demo