python手机代码识别数字_利用python构建神经网络识别手写数字(附源代码)
一.运行环境配置
本次实验的运行环境win10(bit64),采用python环境为3.7.6,安装Python环境推荐使用Anaconda。Anaconda是一个免费开源的Python和R语言的发行版本,用于计算科学(数据科学、机器学习、大数据处理和预测分析)。在python编程中下载相关库是很浪费时间的,Anaconda有效地帮我们解决了这个问题。
我用的编译器是pycharm,建议基于虚拟环境进行编程,pycharm提供了很便利的方式搭建虚拟环境:
这里注意要在inhrerit global site-packages打勾,否则不会继承Anaconda中的数据包。你也可以通过virtualenv在cmd中配置,这里不作演示。
二.准备手写数字的数据集
数据集包括训练集和测试集
也可以在后面我的github上进行下载。
数据集中用数百个像素点(0-255)表示单个数字,第一个数字为数字设定值,后面我们将对其进行切片操作。
三.用python构建神经网络
1.我们先对函数进行初始化,设置输入层节点,输出层节点,学习率和隐层节点。然后再设置连接权重。我们要采用随机矩阵,而不是单个数字,因此采用分布中心值、标准方差和numpy数组的大小作为参数。代码如图:
self.wih = numpy.random.normal(0.0,pow(self.hnodes,0.5),(self.hnodes,self.inodes))
self.who = numpy.random.normal(0.0,pow(self.onodes,0.5),(self.onodes,self.hnodes))
第一个参数为正态分布的中心设定,第二个表示节点数目的0.5次方,第三个参数是我们希望的numpy数组大小。
为了方面后面获得隐藏层节点的输出信息,我们要定义一个激活函数,这里我们不用传统的def()函数,采用lambda快速创建。
self.activation_function = lambda x:scipy.special.expit(x)
这里调用scipy.special函数库,该条命令的含义是输入x,输出expit函数。
2.下面来写查询网络部分的代码:
我们先来做由输入层到隐层这部分,神经元输入层和隐层的节点是相当多的,如果我们逐个节点进行计算,其运算过程是不可想象的,而引入矩阵则可以大大方便我们。隐层的信号即为权重矩阵点乘输入矩阵,隐层的输出则由前面的激活函数获得,从隐层到输出层的过程与此类似,这里一并贴出代码:
def query(self, inputs_list):
inputs = numpy.array(inputs_list,ndmin=2).T
hidden_inputs = numpy.dot(self.wih,inputs)
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = numpy.dot(self.who,hidden_outputs)
final_outputs = self.activation_function(final_inputs)
return final_outputs
3. 我们开始编程最复杂的训练部分,首先是针对给定的训练样本计算输出,这与我们刚刚在query函数中所写的差不多。
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(target_list, ndmin=2).T
hidden_inputs = numpy.dot(self.wih, inputs)
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = numpy.dot(self.who, hidden_outputs)
final_outputs = self.activation_function(final_inputs)
output_errors = targets - final_outputs
hidden_errors = numpy.dot(self.who.T,output_errors)
这里补充一下神经网络更新节点j与下一层节点k之间链接权重的矩阵形式的表达式:
在python中对输入层和隐藏层,隐藏层和输出层进行相关编码:
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0-final_outputs)),numpy.transpose(hidden_outputs))
self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0-hidden_outputs)),numpy.transpose(inputs))
四.识别手写数字
1. 初始化神经网络
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
learning_rate = 0.3
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)
数据集中每个数组用一个28X28的数组表示,故输入节点为784个。
输出为个位数字,故输出节点为10个。
隐层节点数量可自由设置,数量多少会对识别率产生影响,这里我们设为100.
2.导入训练集,这里为提高识别率,我们将训练集循环两次,并对各像素点进行初始化,使其范围编程0.01-0.09,目标输出数组设定值设为1,其他值为0。
data_file = open("mnist_dateset/mnist_train.csv",'r')
data_list = data_file.readlines()
data_file.close()
epochs = 2
for i in range(epochs):
for record in data_list:
all_values = record.split(',')
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
targets = numpy.zeros(output_nodes) + 0.01
targets[int(all_values[0])] = 0.99
n.train(inputs, targets)
2. 读取测试集,验证我们识别的准确率。
数据初始化部分与导入训练集大致相同,随后进行一些绘图的相关设置,同时计算识别成功的次数和总数字数,相除得出识别率。
test_data_file = open("mnist_dateset/mnist_test.csv",'r')
test_data_list = test_data_file.readlines()
test_data_file.close()
# print(data_list[0])
scorecard = []
for record in test_data_list:
all_values = record.split(',')
correct_value = int(all_values[0])
print(all_values[0])
image_array = numpy.asfarray(all_values [1:]).reshape((28,28))
matplotlib.pyplot.imshow( image_array , cmap='Greys' , interpolation='None')
inputs = (numpy.asfarray(all_values[1:])/255.0 * 0.99) + 0.01
outputs = n.query(inputs)
label = numpy.argmax(outputs)
print(label)
if (label == correct_value):
scorecard.append(1)
else:
scorecard.append(0)
scorecard_array = numpy.asarray(scorecard)
五.一些优化
你可以通过更改学习率,隐层节点数量来提高识别率,也可以加入一些较为复杂的算法。该程序中我们使用了sigmoid函数,虽然很美,但由于梯度消失问题而逐渐被淘汰,图像如下
本来以为激活函数的改变会对识别率有很大影响,但尝试了Relu和tanh激活函数后发现其对最终结果几乎没有影响。可能改变对神经网络架构影响大的因素才会更有效地提高识别率。以上代码的识别率约为80,将隐层节点改为200,循环训练集5次(电脑运行了大约十分钟)后识别率变为97.25,代码已经在github上更新。
最后附上源代码链接(内含数据集):
python手机代码识别数字_利用python构建神经网络识别手写数字(附源代码)相关推荐
- 我的Go+语言初体验——Go+语言构建神经网络实战手写数字识别
"我的Go+语言初体验" | 征文活动进行中- 我的Go+语言初体验--Go+语言构建神经网络实战手写数字识别 0. 前言 1. 神经网络相关概念 2. 构建神经网络实战手写数字识 ...
- 神经网络实现手写数字识别(MNIST)
一.缘起 原本想沿着 传统递归算法实现迷宫游戏 --> 遗传算法实现迷宫游戏 --> 神经网络实现迷宫游戏的思路,在本篇当中也写如何使用神经网络实现迷宫的,但是研究了一下, 感觉有些麻烦不 ...
- Python学习记录 搭建BP神经网络实现手写数字识别
搭建BP神经网络实现手写数字识别 通过之前的文章我们知道了,构建一个简单的神经网络需要以下步骤 准备数据 初始化假设 输入神经网络进行计算 输出运行结果 这次,我们来通过sklearn的手写数字数据集 ...
- BP神经网络实现手写数字识别Python实现,带GUI手写画板
BP神经网络实现手写数字识别 BP神经网络模型 用tkinter编写用于手写输入的画板 程序运行的效果截图 在B站看了一个机器学习基础的视频( 链接)后,发现到资料里面有一个用BP神经网络对手写数字进 ...
- 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)
基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...
- DL之DNN:利用DNN算法对mnist手写数字图片识别数据集(sklearn自带,1797*64)训练、预测(95%)
DL之DNN:利用DNN算法对mnist手写数字图片识别数据集(sklearn自带,1797*64)训练.预测(95%) 目录 数据集展示 输出结果 设计代码 数据集展示 先查看sklearn自带di ...
- 单层神经网络实现手写数字识别
Mnist手写数字识别 前言 Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分: 55000行的训练数据集(mn ...
- 神经网络之手写数字识别
神经网络之手写数字 文章目录 神经网络之手写数字 00. 写在之前 01. 代码框架 02. 开始做一些准备工作 03. 框架的开始 04. 训练模型构建 05. 手写数字的识别 06. 想看源码的同 ...
- MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试
文章目录 MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试 一.题目要求 二.完整的目录结构说明 三.Mnist数据集及数据格式转换 四.BP神经网络相关知识 4.1 ...
- 小生不才:tensorflow实战01-基于bp神经网络的手写数字识别
前言 利用搭建网络八股,使用简单的bp神经网络完成手写数字的识别. 搭建过程 导入相应的包 获取数据集,划分数据集和测试集并进行简单处理(归一化等) 对数据进行乱序处理 定义网络结构 选择网络优化器以 ...
最新文章
- 一文读懂如何通过设计模式学习创建对象?
- pytorch移动端,官方helloworld不同模型仍旧好用
- Wince下定制开机自启动程序
- Fast Stone超好用的截图工具,可截取长图,带滚动条的页面
- 如何通俗地解释 C、C++、C#、Java、JavaScript、HTML、Python的用处
- apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard
- 等概率随机函数的实现(对立事件的产生)
- 点到点 Ipsec *** 从一端能正常发起,另一端发起不成功的解决过程
- 手把手教你写一个spring IOC容器
- viewpager的使用
- 常用傅里叶变换公式大全_高二数学常用导数公式大全
- 响应服务器auth first,asp.net mvc发送QQ邮件提示 命令顺序不正确。 服务器响应为: Error: need EHLO and AUTH first !...
- root用户改动普通用户文件
- 非常好用的离线地图APP
- 在SCI-Hub上下载国外论文
- VMware View 5.0-10–远程图形工作站配置篇
- 【流媒体开发】【数据与封装格式】20、AAC码流格式与解析
- php实现成语小游戏,成语小秀才微信小程序源码-PHP代码类资_aqa7qj 源码采用php实现 - 下载 - 搜珍网...
- 作为荣耀脱离华为后的第二代旗舰,荣耀Magic4 Pro是否值得选购?
- Python数据可视化图表大全
热门文章
- QT安装QChart
- 小程序表格组件库wechat-table
- java学习(尚硅谷)集合之Collection接口中的方法
- css 让图片不停的转动
- 中英文说明书丨艾美捷R-Phycoerythrin标记链霉亲和素
- 前端text(),html() ,val()的区别以及共同点
- android物品管理,用 Tasker 与 NFC 实现物品管理
- apdu for java demo_将扩展APDU发送到Javacard
- RAID技术全解图解-RAID0、RAID1、RAID5、RAID100 转载
- 22.JAVA编程思想——排序和搜索