详解Python手写数字识别模型的构建与使用
作者:顾城沐心 发布时间:2023-10-21 18:34:12
标签:Python,手写,数字,识别
一:手写数字模型构建与保存
1 加载数据集
# 1加载数据
digits_data = load_digits()
可以先简单查看下 手写数字集,如下可以隐约看出数字为8
plt.imshow(digits_data.images[8])
plt.show()
2 特征数据 标签数据
# 数据划分
x_data = digits_data.data
y_data = digits_data.target
3 训练集 测试集
# 训练集 + 测试集
x_test = x_data[:40]
y_test = y_data[:40]
x_train = x_data[40:]
y_train = y_data[40:]
# 概率问题
y_train_2 = np.zeros(shape=(len(y_train), 10))
4 数据流图 输入层
input_size = digits_data.data.shape[1] # 输入的列数
# 数据流图的构建
# x:输入64个特征值--像素
x = tf.placeholder(np.float32, shape=[None, input_size])
# y:识别的数字 有几个类别[0-9]
y = tf.placeholder(np.float32, shape=[None, 10])
5 隐藏层
5.1 第一层
# 第一层隐藏层
# 参数1 输入维度 参数2:输出维度(神经元个数) 标准差是0.1的正态分布
w1 = tf.Variable(tf.random_normal([input_size, 80], stddev=0.1))
# b的个数就是隐藏层神经元的个数
b1 = tf.Variable(tf.constant(0.01), [80])
# 第一层计算
one = tf.matmul(x, w1) + b1
# 激活函数 和0比 大于0则激活
op1 = tf.nn.relu(one)
5.2 第二层
# 第二层隐藏层 上一层输出为下一层输入
# 参数1 输入维度 参数2:输出维度(神经元个数) 标准差是0.1的正态分布
w2 = tf.Variable(tf.random_normal([80, 10], stddev=0.1))
# b的个数就是隐藏层神经元的个数
b2 = tf.Variable(tf.constant(0.01), [10])
# 第一层计算
two = tf.matmul(op1, w2) + b2
# 激活函数 和0比 大于0则激活
op2 = tf.nn.relu(two)
6 损失函数
# 构建损失函数
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=op2))
7 梯度下降算法
# 梯度下降算法
Optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.005).minimize(loss)
8 输出损失值
# 变量初始化
init = tf.global_variables_initializer()
data_size = digits_data.data.shape[0]
# 开启会话
with tf.Session() as sess:
sess.run(init)
# 训练次数
for i in range(500):
# 数据分组
start = (i * 100) % data_size
end = min(start + 100, data_size)
batch_x = x_train[start:end]
batch_y = y_train_2[start:end]
sess.run(Optimizer, feed_dict={x: batch_x, y: batch_y})
# 输出损失值
train_loss = sess.run(loss, feed_dict={x: batch_x, y: batch_y})
print(train_loss)
9 模型 保存与使用
obj = tf.train.Saver()
# 模型保存
obj.save(sess, 'model-digits.ckpt')
10 完整源码分享
import tensorflow as tf
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1加载数据
digits_data = load_digits()
# 查看数据
# print(digits_data)
# 查看数据基本特征 (1797, 64) 64:8*8像素点
# print(digits_data.data.shape)
# plt.imshow(digits_data.images[8])
# plt.show()
# 数据划分
x_data = digits_data.data
y_data = digits_data.target
# 训练集 + 测试集
x_test = x_data[:40]
y_test = y_data[:40]
x_train = x_data[40:]
y_train = y_data[40:]
# 概率问题
y_train_2 = np.zeros(shape=(len(y_train), 10))
# 对应的分类 当前行对应列变成1
for index, row in enumerate(y_train_2):
# 当前行 对应的数字对应列
row[int(y_train[index])] = 1
# print(y_train_2[0])
input_size = digits_data.data.shape[1] # 输入的列数
# 数据流图的构建
# x:输入64个特征值--像素
x = tf.placeholder(np.float32, shape=[None, input_size])
# y:识别的数字 有几个类别[0-9]
y = tf.placeholder(np.float32, shape=[None, 10])
# 第一层隐藏层
# 参数1 输入维度 参数2:输出维度(神经元个数) 标准差是0.1的正态分布
w1 = tf.Variable(tf.random_normal([input_size, 80], stddev=0.1))
# b的个数就是隐藏层神经元的个数
b1 = tf.Variable(tf.constant(0.01), [80])
# 第一层计算
one = tf.matmul(x, w1) + b1
# 激活函数 和0比 大于0则激活
op1 = tf.nn.relu(one)
# 第二层隐藏层 上一层输出为下一层输入
# 参数1 输入维度 参数2:输出维度(神经元个数) 标准差是0.1的正态分布
w2 = tf.Variable(tf.random_normal([80, 10], stddev=0.1))
# b的个数就是隐藏层神经元的个数
b2 = tf.Variable(tf.constant(0.01), [10])
# 第一层计算
two = tf.matmul(op1, w2) + b2
# 激活函数 和0比 大于0则激活
op2 = tf.nn.relu(two)
# 构建损失函数
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=op2))
# 梯度下降算法 优化器 learning_rate学习率(步长)
Optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.005).minimize(loss)
# 变量初始化
init = tf.global_variables_initializer()
data_size = digits_data.data.shape[0]
# 开启会话
with tf.Session() as sess:
sess.run(init)
# 训练次数
for i in range(500):
# 数据分组
start = (i * 100) % data_size
end = min(start + 100, data_size)
batch_x = x_train[start:end]
batch_y = y_train_2[start:end]
sess.run(Optimizer, feed_dict={x: batch_x, y: batch_y})
# 输出损失值
train_loss = sess.run(loss, feed_dict={x: batch_x, y: batch_y})
print(train_loss)
obj = tf.train.Saver()
# 模型保存
obj.save(sess, 'modelSave/model-digits.ckpt')
损失值在0.303左右,如下图所示
二:手写数字模型使用与测试
对上一步创建的模型,使用测试
import tensorflow as tf
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1加载数据
digits_data = load_digits()
# 数据划分
x_data = digits_data.data
y_data = digits_data.target
# 训练集 + 测试集
x_test = x_data[:40]
y_test = y_data[:40]
x_train = x_data[40:]
y_train = y_data[40:]
# 概率问题
y_train_2 = np.zeros(shape=(len(y_train), 10))
# 对应的分类 当前行对应列变成1
for index, row in enumerate(y_train_2):
# 当前行 对应的数字对应列
row[int(y_train[index])] = 1
# 网络搭建
num_class = 10 # 数字0-9
hidden_num = 80 # 神经元个数
input_size = digits_data.data.shape[1] # 输入的列数
# 数据流图的构建
# x:输入64个特征值--像素
x = tf.placeholder(np.float32, shape=[None, 64])
# y:识别的数字 有几个类别[0-9]
y = tf.placeholder(np.float32, shape=[None, 10])
# 第一层隐藏层
# 参数1 输入维度 参数2:输出维度(神经元个数) 标准差是0.1的正态分布
w1 = tf.Variable(tf.random_normal([input_size, 80], stddev=0.1))
# b的个数就是隐藏层神经元的个数
b1 = tf.Variable(tf.constant(0.01), [80])
# 第一层计算
one = tf.matmul(x, w1) + b1
# 激活函数 和0比 大于0则激活
op1 = tf.nn.relu(one)
# 第二层隐藏层 上一层输出为下一层输入
# 参数1 输入维度 参数2:输出维度(神经元个数) 标准差是0.1的正态分布
w2 = tf.Variable(tf.random_normal([80, 10], stddev=0.1))
# b的个数就是隐藏层神经元的个数
b2 = tf.Variable(tf.constant(0.01), [10])
# 第一层计算
two = tf.matmul(op1, w2) + b2
# 激活函数 和0比 大于0则激活
op2 = tf.nn.relu(two)
# 变量初始化
init = tf.global_variables_initializer()
train_count = 500
batch_size = 100
data_size = x_train.shape[0]
pre_max_index = tf.argmax(op2, 1)
plt.imshow(digits_data.images[13]) # 3
plt.show()
with tf.Session() as sess:
sess.run(init)
# 使用网络
obj = tf.train.Saver()
obj.restore(sess, 'modelSave/model-digits.ckpt')
print(sess.run(op2, feed_dict={x: [x_test[13], x_test[14]]}))
print(sess.run(pre_max_index, feed_dict={x: [x_test[13], x_test[14]]}))
想要测试的数据,如下图所示
使用模型测试出来的结果,如下图所示,模型基本能够使用
来源:https://blog.csdn.net/m0_56051805/article/details/128398291
0
投稿
猜你喜欢
- 一、form介绍我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。与此同
- 背景在小站点上,直接用git来部署php代码相当方便,你的远程站点以及本地版本库都有一个版本控制,追踪问题或者回滚是很轻松的事情。因为在小公
- ASP实现防止网站被采集代码如下:<% Dim AppealNum,AppealCount Appeal
- 技巧 16:如果页面需要很长时间才能完成,那么执行前使用 Response.IsClientConnected 如果用户性急,他们可能会在您
- 本人已经在运维行业工作了将近十年,我最早接触Linux是在大二的样子,那时候只追求易懂,所以就选择了Ubuntu作为学习、使用的对象,它简单
- swagger介绍Swagger本质上是一种用于描述使用JSON表示的RESTful API的接口描述语言。Swagger与一组开源软件工具
- 五一在家写的,和大家分享,支持所有浏览器,添加了左侧菜单点击变色效果<!DOCTYPE html PUBLIC "-//W3
- 一、使用 print() 函数在 Python 中,print() 函数支持格式化输出,与 C 语言的 printf 类似。1. 格式化输出
- PHP get_html_translation_table() 函数实例输出 htmlspecialchars 函数使用的翻译表:<
- 代码如下:ALTER function [dbo].[GetOrderNum]( @ebaystockflag varchar(20)//规
- 自己从工艺品设计到平面设计到网络设计,虽然设计原则不离其宗,但经验下来的心得告诉自己,设计媒介的变化带来很多媒介自身的特殊性,下面总结下网站
- 前言随着人工智能研究的不断兴起,Python的应用也在不断上升,由于Python语言的简洁性、易读性以及可扩展性,特别是在开源工具和深度学习
- 某天气网站(www.数字.com)存有2011年至今的天气数据,有天看到一本爬虫教材提到了爬取这些数据的方法,学习之,并加以改进。准备爬的历
- Python 高级专用类方法的实例详解除了 __getitem__ 和 __setitem__ 之外 Python 还有更多的专用函数。某些
- 如果不用“with”,那么Python会在何时关闭文件呢?答案是:视情况而定。Python程序员最初学到的东西里有一点就是可以通过迭代法很容
- 一、命名元祖在python基础中, 我们学习元祖的时候,取元祖内部的元素都是通过索引来进行取值的。但是这种取值方式不够友好, 所以我们引入命
- 和之前C++执行Linux Bash命令的方法 一样,Python依然支持system调用和popen()函数来执行linux bash命令
- 如何制作K线图?也不难,代码和说明见下:<%@ Language=VBScript %><%Respo
- Django中内置了邮件发送功能,被定义在django.core.mail模块中。发送邮件需要使用SMTP服务器,常用的免费服务器有:163
- 当你链接到应用程序以使用MySQL客户端库时,可能会遇到以mysql_开始的未定义引用错误,如下所示:/tmp/ccFKsdPa.o: 在函