本实验使用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. 利用MATLAB截取一张复杂图片中想要的区域

    A = imread('1.jpg'); imshow(A); [x,y] = ginput(2);    %确定图像上的两点利用ginput函数,返回值是两点的坐标 pic_1 = imcrop(A ...

  2. Ubuntu下ssh的安装

    1.安装 Ubuntu缺省安装了openssh-client,,如果没有安装,可用apt-get安装上即可. 安装ssh-server sudo apt-get install openssh-ser ...

  3. NumPy 矩阵库(Matrix)

    NumPy 矩阵库(Matrix) NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是 ndarray 对象. 一个 的矩阵是一个由行(row)列(col ...

  4. Python delattr() 函数

    Python delattr() 函数  Python 内置函数 描述 delattr 函数用于删除属性. delattr(x, 'foobar') 相等于 del x.foobar. 语法 dela ...

  5. chase

    chase 英[tʃeɪs] 美[tʃes] vt. 追求; 追捕; 追寻; 镂刻; n. 追捕; 打猎; 猎物(指鸟兽等); 槽; vi. 追逐,追赶; 追寻; 追求(常与after连用); [口语 ...

  6. Unity4.6证书激活问题

    第一次运行的激活问题 安装好Unity4.6之后首次启动会自动连网,但是会出现error loading page错误,SSL peer certificate or SSH remote key w ...

  7. Codeforces Round #541 (Div. 2)

    Codeforces Round #541 (Div. 2) http://codeforces.com/contest/1131 A #include<bits/stdc++.h> us ...

  8. c中堆栈的理解

    一直对堆栈的使用以及全局变量.静态全局变量.局部变量.静态局部变量.初始化的全局变量.未初始化的全局变量.初始化的局部变量.未初始化的局部变量理解的不是很清楚,今天抽个时间来总结以下这方面的知识: 1 ...

  9. mac item2 ssh

    一.常规ssh登录流程 ssh登陆有三个参数,主机名,用户名,用户密码,流程都是一样. 1.ssh 用户名@主机名 2.返回包含(yes/no)的字符串,此时输入 “yes" 3.然后再返回 ...

  10. Python: PySide(PyQt)QMessageBox按钮显示中文

    习惯了Delphi.c#调用系统MessageBox本地化显示,待用PySide调用时,Qt原生提示对话框,默认以英文显示. 如何本地化呢? 参考些资料,加以摸索,实现所需效果.并可根据此思路,设计自 ...