BP神经网络在python下的自主搭建梳理
本实验使用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下的自主搭建梳理的更多相关文章
- BP神经网络与Python实现
人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善. 联想大家熟悉的回归问题, 神经网络模型实际上是根据训练样本创造出一个多维输入多维输出的函数, 并使用该函数进行预测, 网 ...
- 三层BP神经网络的python实现
这是一个非常漂亮的三层反向传播神经网络的python实现,下一步我准备试着将其修改为多层BP神经网络. 下面是运行演示函数的截图,你会发现预测的结果很惊人! 提示:运行演示函数的时候,可以尝试改变隐藏 ...
- 模式识别之ocr项目---(模板匹配&BP神经网络训练)
摘 要 在MATLAB环境下利用USB摄像头采集字符图像,读取一帧保存为图像,然后对读取保存的字符图像,灰度化,二值化,在此基础上做倾斜矫正,对矫正的图像进行滤波平滑处理,然后对字符区域进行提取分割出 ...
- 字符识别OCR研究一(模板匹配&BP神经网络训练)
摘 要 在MATLAB环境下利用USB摄像头採集字符图像.读取一帧保存为图像.然后对读取保存的字符图像,灰度化.二值化,在此基础上做倾斜矫正.对矫正的图像进行滤波平滑处理,然后对字符区域进行提取切割出 ...
- 用Python实现BP神经网络(附代码)
用Python实现出来的机器学习算法都是什么样子呢? 前两期线性回归及逻辑回归项目已发布(见文末链接),今天来讲讲BP神经网络. BP神经网络 全部代码 https://github.com/lawl ...
- python手写bp神经网络实现人脸性别识别1.0
写在前面:本实验用到的图片均来自google图片,侵删! 实验介绍 用python手写一个简单bp神经网络,实现人脸的性别识别.由于本人的机器配置比较差,所以无法使用网上很红的人脸大数据数据集(如lf ...
- Python语言编写BP神经网络
Python语言编写BP神经网络 2016年10月31日 16:42:44 ldy944758217 阅读数 3135 人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善 ...
- BP神经网络原理及python实现
[废话外传]:终于要讲神经网络了,这个让我踏进机器学习大门,让我读研,改变我人生命运的四个字!话说那么一天,我在乱点百度,看到了这样的内容: 看到这么高大上,这么牛逼的定义,怎么能不让我这个技术宅男心 ...
- Python实现bp神经网络识别MNIST数据集
title: "Python实现bp神经网络识别MNIST数据集" date: 2018-06-18T14:01:49+08:00 tags: [""] cat ...
随机推荐
- 有人说,即使没有JavaScript,你也可以做网页。在纯HTML
有人说,即使没有JavaScript,你也可以做网页.在纯HTML +服务器端语言理论中也可以完成所有功能,那么,为什么以及在哪里存在JavaScript? JS,全称JavaScript 在 ...
- 三星笔记本安装系统时报错:image failed to verify with * access denied* press any key to continue.
安装系统从光盘启动报错: 出现黑屏,并且有一个提示框image failed to verify with *access denied*press any key to continue 原因:三星 ...
- CentOS Mysql常用命令
1.更改root密码 mysqladmin -uroot password 'yourpassword' 2.远程登陆mysql服务器 mysql -uroot -p -h192.168.137.10 ...
- [剑指Offer]35-复杂链表的复制
链接 https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&tqId=11178&tPa ...
- day 20 类与类之间的关系,继承2
类与类之间的关系: 依赖关系 关联关系 聚合关系 组合关系 依赖关系: 大象与冰箱的例子 # 依赖关系,冰箱依赖大象打开 class Elephant: def __init__(self,name) ...
- SCP对拷如何连接指定端口远程主机
SCP对拷如何连接指定端口(非22端口)的远程主机 scp -P 远程端口号 本机待拷贝文件路径 远程主机用户名@远程主机地址:远程主机目的路径 注意: 1. 参数-P 的位置一定要紧跟在s ...
- rviz1
msckf_vio ####查看topic列表:wj@wj-Inspiron-5437:~$ rostopic list/benchmark_publisher/path/cam0/image_raw ...
- ubuntu 无法挂载U盘
问题描述: usb 1-1: device descriptor read/64,error 18usb 1-1: device descriptor read/64,error 18usb 1-1: ...
- Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"
https://blog.csdn.net/saucyj/article/details/79043443
- oracle 分页 where 三层
查询[start,start+limit],包含start,包含start+limit,如start=21,limit=10结果就是21到30,包含21和30SELECT * FROM (SELECT ...