一.运行环境配置

本次实验的运行环境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构建神经网络识别手写数字(附源代码)相关推荐

  1. 我的Go+语言初体验——Go+语言构建神经网络实战手写数字识别

    "我的Go+语言初体验" | 征文活动进行中- 我的Go+语言初体验--Go+语言构建神经网络实战手写数字识别 0. 前言 1. 神经网络相关概念 2. 构建神经网络实战手写数字识 ...

  2. 神经网络实现手写数字识别(MNIST)

    一.缘起 原本想沿着 传统递归算法实现迷宫游戏 --> 遗传算法实现迷宫游戏 --> 神经网络实现迷宫游戏的思路,在本篇当中也写如何使用神经网络实现迷宫的,但是研究了一下, 感觉有些麻烦不 ...

  3. Python学习记录 搭建BP神经网络实现手写数字识别

    搭建BP神经网络实现手写数字识别 通过之前的文章我们知道了,构建一个简单的神经网络需要以下步骤 准备数据 初始化假设 输入神经网络进行计算 输出运行结果 这次,我们来通过sklearn的手写数字数据集 ...

  4. BP神经网络实现手写数字识别Python实现,带GUI手写画板

    BP神经网络实现手写数字识别 BP神经网络模型 用tkinter编写用于手写输入的画板 程序运行的效果截图 在B站看了一个机器学习基础的视频( 链接)后,发现到资料里面有一个用BP神经网络对手写数字进 ...

  5. 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)

    基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...

  6. DL之DNN:利用DNN算法对mnist手写数字图片识别数据集(sklearn自带,1797*64)训练、预测(95%)

    DL之DNN:利用DNN算法对mnist手写数字图片识别数据集(sklearn自带,1797*64)训练.预测(95%) 目录 数据集展示 输出结果 设计代码 数据集展示 先查看sklearn自带di ...

  7. 单层神经网络实现手写数字识别

    Mnist手写数字识别 前言 Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分: 55000行的训练数据集(mn ...

  8. 神经网络之手写数字识别

    神经网络之手写数字 文章目录 神经网络之手写数字 00. 写在之前 01. 代码框架 02. 开始做一些准备工作 03. 框架的开始 04. 训练模型构建 05. 手写数字的识别 06. 想看源码的同 ...

  9. MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试

    文章目录 MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试 一.题目要求 二.完整的目录结构说明 三.Mnist数据集及数据格式转换 四.BP神经网络相关知识 4.1 ...

  10. 小生不才:tensorflow实战01-基于bp神经网络的手写数字识别

    前言 利用搭建网络八股,使用简单的bp神经网络完成手写数字的识别. 搭建过程 导入相应的包 获取数据集,划分数据集和测试集并进行简单处理(归一化等) 对数据进行乱序处理 定义网络结构 选择网络优化器以 ...

最新文章

  1. 一文读懂如何通过设计模式学习创建对象?
  2. pytorch移动端,官方helloworld不同模型仍旧好用
  3. Wince下定制开机自启动程序
  4. Fast Stone超好用的截图工具,可截取长图,带滚动条的页面
  5. 如何通俗地解释 C、C++、C#、Java、JavaScript、HTML、Python的用处
  6. apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard
  7. 等概率随机函数的实现(对立事件的产生)
  8. 点到点 Ipsec *** 从一端能正常发起,另一端发起不成功的解决过程
  9. 手把手教你写一个spring IOC容器
  10. viewpager的使用
  11. 常用傅里叶变换公式大全_高二数学常用导数公式大全
  12. 响应服务器auth first,asp.net mvc发送QQ邮件提示 命令顺序不正确。 服务器响应为: Error: need EHLO and AUTH first !...
  13. root用户改动普通用户文件
  14. 非常好用的离线地图APP
  15. 在SCI-Hub上下载国外论文
  16. VMware View 5.0-10–远程图形工作站配置篇
  17. 【流媒体开发】【数据与封装格式】20、AAC码流格式与解析
  18. php实现成语小游戏,成语小秀才微信小程序源码-PHP代码类资_aqa7qj 源码采用php实现 - 下载 - 搜珍网...
  19. 作为荣耀脱离华为后的第二代旗舰,荣耀Magic4 Pro是否值得选购?
  20. Python数据可视化图表大全

热门文章

  1. QT安装QChart
  2. 小程序表格组件库wechat-table
  3. java学习(尚硅谷)集合之Collection接口中的方法
  4. css 让图片不停的转动
  5. 中英文说明书丨艾美捷R-Phycoerythrin标记链霉亲和素
  6. 前端text(),html() ,val()的区别以及共同点
  7. android物品管理,用 Tasker 与 NFC 实现物品管理
  8. apdu for java demo_将扩展APDU发送到Javacard
  9. RAID技术全解图解-RAID0、RAID1、RAID5、RAID100 转载
  10. 22.JAVA编程思想——排序和搜索