本实验使用mnist数据集完成手写数字识别的测试。识别正确率认为是95%

完整代码如下:

 #!/usr/bin/env python
# coding: utf-8 # In[1]: import numpy
import scipy.special
import matplotlib.pyplot # In[2]: class neuralNetwork:
def __init__(self, inputNodes, hiddenNodes, outputNodes,learningRate):
self.iNodes = inputNodes
self.oNodes = outputNodes
self.hNodes = hiddenNodes
self.lr = learningRate
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)) self.activation_function = lambda x: scipy.special.expit(x)
#print(self.wih)
pass def train(self,inputs_list, target_list):
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(target_list, ndmin=2).T
#print(inputs)
#print(targets)
hidden_inputs = numpy.dot(self.wih,inputs)
#print(self.wih.shape)
#print(inputs.shape)
hidden_outputs = self.activation_function(hidden_inputs)
#print(hidden_inputs)
final_inputs = numpy.dot(self.who,hidden_outputs)
#print(hidden_outputs)
final_outputs = self.activation_function(final_inputs) output_errors = targets - final_outputs
hidden_errors = numpy.dot(self.who.T,output_errors)
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))
pass 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_outpus = self.activation_function(final_inputs)
return final_outpus
pass # In[3]: inputNodes = 784
outputNodes = 10
hiddenNodes = 100
learningRate = 0.1
nN = neuralNetwork(inputNodes, hiddenNodes, outputNodes, learningRate) # In[4]: data_file = open("mnist_train.csv",'r')
data_list = data_file.readlines()
data_file.close() # In[5]: epochs = 1
for e 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(outputNodes) + 0.01
targets[int (all_values[0])] = 0.99
nN.train(inputs,targets)
pass
pass # In[6]: test_data_file = open("mnist_test.csv",'r')
test_data_list = test_data_file.readlines()
test_data_file.close() # In[7]: scorecard = []
for record in test_data_list:
all_values = record.split(',')
correct_label = int(all_values[0])
inputs = numpy.asfarray( all_values [1:])/255.0*0.99+0.01
outputs = nN.query(inputs)
label = numpy.argmax(outputs)
if(label == correct_label):
scorecard.append(1)
else:
scorecard.append(0)
pass
pass # In[8]: scorecard_array = numpy.asarray(scorecard)
print ("performance = " ,scorecard_array.sum()/scorecard_array.size) # In[9]: import scipy.misc
img_array = scipy.misc.imread('test.png',flatten="True")
img_data = 255.0 - img_array . reshape(784)
img_data = (img_data /255.0 * 0.99 ) + 0.01
op=nN.query(img_data)
print(op)
print(numpy.argmax(op)) # In[10]: all_values = data_list[1].split(',')
image_array = numpy.asfarray( all_values [1:]).reshape((28,28))
matplotlib.pyplot.imshow(image_array, cmap = 'Greys',interpolation='None')

IN[9]到IN[10]的代码分别用于测试自己制作的数字识别效果和显示图像。可去掉。

代码运行过程需要mnist数据集,链接:https://pan.baidu.com/s/120GTdZ8Tivkp1KD9VQ_XeQ

BP神经网络的结构:https://www.cnblogs.com/bai2018/p/10353768.html

在输入层的神经元数据选取上,和像素数量一致。MNIST采用28X28的像素点,则输入层的神经元数量为28*28=784个

输入层和隐层,输出层和隐层之间的权值选取为随机数。使用正态分布的随机数较好。

隐层的神经元数量合适即可,取值为经验法,假设为100个

输出层神经元表示数据0-9,则使用10个神经元,分别表示数字0-9的可能性概率。

训练过程中使用的学习效率,取0.2吧。。。

将权重,各层神经元值,误差等,表示为矩阵数据进行处理。

正向传递数据查询结果,误差的反向传递改变权重等过程,涉及到的数学推导:https://www.cnblogs.com/bai2018/p/10353814.html

BP神经网络在python下的自主搭建梳理的更多相关文章

  1. BP神经网络与Python实现

    人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善. 联想大家熟悉的回归问题, 神经网络模型实际上是根据训练样本创造出一个多维输入多维输出的函数, 并使用该函数进行预测, 网 ...

  2. 三层BP神经网络的python实现

    这是一个非常漂亮的三层反向传播神经网络的python实现,下一步我准备试着将其修改为多层BP神经网络. 下面是运行演示函数的截图,你会发现预测的结果很惊人! 提示:运行演示函数的时候,可以尝试改变隐藏 ...

  3. 模式识别之ocr项目---(模板匹配&BP神经网络训练)

    摘 要 在MATLAB环境下利用USB摄像头采集字符图像,读取一帧保存为图像,然后对读取保存的字符图像,灰度化,二值化,在此基础上做倾斜矫正,对矫正的图像进行滤波平滑处理,然后对字符区域进行提取分割出 ...

  4. 字符识别OCR研究一(模板匹配&BP神经网络训练)

    摘 要 在MATLAB环境下利用USB摄像头採集字符图像.读取一帧保存为图像.然后对读取保存的字符图像,灰度化.二值化,在此基础上做倾斜矫正.对矫正的图像进行滤波平滑处理,然后对字符区域进行提取切割出 ...

  5. 用Python实现BP神经网络(附代码)

    用Python实现出来的机器学习算法都是什么样子呢? 前两期线性回归及逻辑回归项目已发布(见文末链接),今天来讲讲BP神经网络. BP神经网络 全部代码 https://github.com/lawl ...

  6. python手写bp神经网络实现人脸性别识别1.0

    写在前面:本实验用到的图片均来自google图片,侵删! 实验介绍 用python手写一个简单bp神经网络,实现人脸的性别识别.由于本人的机器配置比较差,所以无法使用网上很红的人脸大数据数据集(如lf ...

  7. Python语言编写BP神经网络

    Python语言编写BP神经网络 2016年10月31日 16:42:44 ldy944758217 阅读数 3135   人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善 ...

  8. BP神经网络原理及python实现

    [废话外传]:终于要讲神经网络了,这个让我踏进机器学习大门,让我读研,改变我人生命运的四个字!话说那么一天,我在乱点百度,看到了这样的内容: 看到这么高大上,这么牛逼的定义,怎么能不让我这个技术宅男心 ...

  9. Python实现bp神经网络识别MNIST数据集

    title: "Python实现bp神经网络识别MNIST数据集" date: 2018-06-18T14:01:49+08:00 tags: [""] cat ...

随机推荐

  1. 四 sys模块

    1 sys.argv 命令行参数List,第一个元素是程序本身路径 2 sys.exit(n) 退出程序,正常退出时exit(0) 3 sys.version 获取Python解释程序的版本信息 4 ...

  2. 弹出序列(python)

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  3. 程序员的数学 三册数学,概率统计、线性代数pdf

    程序员的数学1 2012.pdf 2012版 程序员的数学2 概率统计 ,平冈和幸,(日)堀玄著 ,P4006 2015.pdf 2015版 程序员的数学3-线性代数 2016.pdf 2016版 如 ...

  4. stm32初做项目心得

    在导师的带领下,基本了解了嵌入式的开发的基本流程: 1.首先从厂家拿到样板之后,首先进行检测,检测什么呢,先检测电源系统,看你的电源系统是否能够正常工作,就是各个管脚是否短路,断路. 2.检测完之后, ...

  5. linux命令学习之:cp

    cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一. 如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同时指定多个文 ...

  6. mysql乐观锁总结和实践(一)

    最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持 ...

  7. JSP使用sessionScope获取session值

    场景:有些实体对象可以放到HttpSession对象中,保正在一个会话期间可以随时获取这个对象的属性,例如可以将登录用户的信息写入session,以保证页面随时可以获取并显示这个用户的状态信息.下面以 ...

  8. ABP框架使用Mysql数据库

    参考文档:https://github.com/ABPFrameWorkGroup/AbpDocument2Chinese/blob/master/Markdown/Abp/9.4ABP%E5%9F% ...

  9. shell 脚本编写基础

    在进行Linux测试时编写脚本是必不可少的,Shell脚本的名称可以随便定义,也不要什么后缀名,例如可以写abc,smartzip这类名称,运行时只要键入 ./smartzip就能运行脚本了.. 每行 ...

  10. vue缓存之keep-alive,设置想要缓存的页面

    由于项目需求从a页面跳转到b页面,返回a页面,a页面数据不能被刷新掉,方法很多列举12 方法1 a页面通过学期按钮切换学期,该学期里more进入b页面,返回a页面,返回回到对应a页面进入的高亮按钮设置 ...