2019/4/23更新

下文中的正确率极高是建立在仅有50组训练数据的基础上的,十分不可靠。建议使用提供的另一个生成训练集的generate_all函数,能产生所有可能结果,更加可靠。

2019/4/20

二层BP神经网络

但是仍有部分在公式上的不明了,但是其运作方式还是很简单的,先简单解析我的代码

from createData import generate_data

是本次所解题目的训练集生成软件,generate_data(N)会返回两个数组,一个为N乘100的训练集及其对应的N乘1的结果,十分方便

L0=2*np.random.random((100,5))-1
L1=2*np.random.random((5,1))-1

由于本次想构建的是二层神经网络,因此需要两层的计算层,其中我将中间的隐藏层设置为5个神经元,而输出层的表示方法为0.1~0.6的离散数,而不是6个0或1元素的数组,因此输出层为1个神经元(而不是6个),这样经过矩阵运算后矩阵维度能够与结果相同。

def sigmoid(x):
return 1/(1+np.exp(-x))

本次使用的激活函数:sigmoid函数,特点为非线性(并不是条直线),区间在[0,1]上,且没有任何点导数为0(趋近于0的有),同时他的导数也非常简洁:

def dsigmoid(x):
return x*(1-x)

因此这一次选择使用这个激活函数。

生成数据:

X,Y=generate_data(50)
X=np.array(X)
Y=np.array(Y)
#shape of parameters
#X(50*100) Y(50*1)
#L0(100*5) L1(5*1)
L0=2*np.random.random((100,5))-1
L1=2*np.random.random((5,1))-1

要谨记转换两数据的形式(List/Array)

并且标记出来了X,Y,L0,L1,分别的维数方便查看,其中L0,L1的生成方式是产生了填满位于[-1,1]的元素的数组(应该是吧...)

主题训练过程:

for i in range(50000):
#forward
temp0=X
temp1=sigmoid(np.dot(temp0,L0))
temp2=sigmoid(np.dot(temp1,L1))
error2=Y-temp2
if (i%5000)==0:
print(np.mean(error2))
#backward
d2=error2*dsigmoid(temp2)
error1=d2.dot(L1.T)
d1=error1*dsigmoid(temp1)
L1+=temp1.T.dot(d2)
L0+=temp0.T.dot(d1)

整体而言得益于矩阵使得过程十分流畅,内容主要涉及到了不断的求偏导并运用链式法则不断"接近"结果与目标变量的偏导,先不赘述算法了。

最后的检验部分...应该也不用再讲什么了吧...

同时由于开始的层元素为随机生成所以每次运行不一定相同,可以用seed()函数解决这个问题

Test1:

-0.19711045500123067
-5.796510982417874e-05
-2.6806406495373803e-05
-1.2019265739013352e-05
-5.227927664957222e-06
-2.2248997057949804e-06
-9.364114896748266e-07
-3.9213879621080584e-07
-1.6385924452994028e-07
-6.84074828341541e-08
[[0.40000002]
[0.50000153]]
[[0.4]
[0.5]]

Test2:

0.16291901475086618
-0.0035140803158310225
1.9674898472920034e-05
2.840084784809016e-05
1.790320520679012e-05
1.059859397264329e-05
5.907123617054088e-06
3.147002414242428e-06
1.6152543191538805e-06
3.5777556424282377e-07
[[0.40004171]
[0.50000385]]
[[0.4]
[0.5]]

不过倒是可以看出来挺准确的就是了...

更新一张学习时的正确率的图片:



可以看出在很早的时候就已经能接近100%了,十分惊人,相关代码如下:

y=[]

count=0
for i in range(Y.size):
if(abs(temp2[i][0]-Y[i][0]))<=0.001:
count +=1
y.append(count/Y.size)
x=np.linspace(0,50000,50000)
plt.plot(x,y)
plt.show()

完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
from createData import generate_data def sigmoid(x):
return 1/(1+np.exp(-x)) def dsigmoid(x):
return x*(1-x) X,Y=generate_data(50)
X=np.array(X)
Y=np.array(Y) #shape of parameters
#X(50*100) Y(50*1)
#L0(100*5) L1(5*1) L0=2*np.random.random((100,5))-1
L1=2*np.random.random((5,1))-1
y=[]
for i in range(50000):
#forward
count=0
temp0=X
temp1=sigmoid(np.dot(temp0,L0))
temp2=sigmoid(np.dot(temp1,L1)) error2=Y-temp2
if (i%5000)==0:
print(np.mean(error2))
for i in range(Y.size):
if(abs(temp2[i][0]-Y[i][0]))<=0.001:
count +=1
y.append(count/Y.size)
#backward
d2=error2*dsigmoid(temp2)
error1=d2.dot(L1.T)
d1=error1*dsigmoid(temp1) L1+=temp1.T.dot(d2)
L0+=temp0.T.dot(d1) X1,Y1=generate_data(2)
X1=np.array(X1)
Y1=np.array(Y1)
t1=sigmoid(np.dot(X1,L0))
t2=sigmoid(np.dot(t1,L1))
x=np.linspace(0,50000,50000)
plt.plot(x,y)
plt.show()
print(t2)
print(Y1)

Python实现——二层BP神经网络的更多相关文章

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

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

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

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

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

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

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

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

  5. BP神经网络与Python实现

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

  6. python构建bp神经网络_曲线拟合(一个隐藏层)__2.代码实现

    IDE:jupyter 抽象程度可能不是那么高,以后再优化. 理论和代码实现的差距还是挺大的 数据集请查看 python构建bp神经网络(一个隐藏层)__1.数据可视化 部分代码预览 git上传.ip ...

  7. BP神经网络在python下的自主搭建梳理

    本实验使用mnist数据集完成手写数字识别的测试.识别正确率认为是95% 完整代码如下: #!/usr/bin/env python # coding: utf-8 # In[1]: import n ...

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

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

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

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

随机推荐

  1. 【祥哥带你玩HoloLens开发】了解如何实现远程主机为HoloLens实时渲染

    今天有一个兄弟在群里讲到他们的项目模型比较大,单用HoloLens运行设备的性能无法满足需要,问道如何将渲染工作交给服务器来做,讲渲染结果传给HoloLens.正好刚刚看官方github的时候发现一个 ...

  2. mybaties 一对多关系映射

    背景: 数据库格式如下图所示 现在要统计出在一段时间内dimension_type为op即所有运营商的pv.uv.vv等指标的数组,以便页面显示出每个运营商在该事件段内历史指标曲线图. 分析: 返回的 ...

  3. UML建模之类图

    UML类间关系的种类 从一个示例开始 请看以下这个类图,类之间的关系是我们需要关注的: 车的类图结构为<<abstract>>,表示车是一个抽象类: 它有两个继承类:小汽车和自 ...

  4. Openssl sess_id命令

    一.简介 sess_id指令是一个调试工具,用来处理SSL_SESSION结构的,可以打印出其中的细节 二.语法 openssl sess_id [-inform PEM|DER] [-outform ...

  5. LoadRunner11学习记录一 -- 安装

    一.首先是安装,相关的下载文件如下: 安装文件:http://pan.baidu.com/s/1ntH0Rd3 破解补丁:http://pan.baidu.com/s/1hq2HRsK 汉化包:htt ...

  6. 向对象(OO)程序设计

    http://www.uml.org.cn/mxdx/201208232.asp 前言 本文主要介绍面向对象(OO)程序设计,以维基百科的解释: 面向对象程序设计(英语:Object-oriented ...

  7. Java设计模式(2)——工厂方法模式

    工厂方法模式同样属于类的创建型模式又被称为多态工厂模式.工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色, ...

  8. modifiers标量调节器插件的定义和使用

    在插件目录plugins里新建文件 modifier.插件名.php文件(如 modifier.插件名.php)例:function smarty_modifier_test($utime, $for ...

  9. myeclipse如何取消对某个文件的验证

    在用Myeclipse导入新工程或在写代码时,最郁闷的就是它对js,jsp,html的验证太严格了,有时会呈现一个红叉或者一个黄色的感慨号,一运行就报Cannot return from outsid ...

  10. .net Tuple特性

    .net 4.0 引入了 Tuple特性: 在C# 4.0之前我们函数有多个返回值,通常是使用ref,out .到了c# 4.0 应当使用元组Tuple而不是使用输出参数,在任何时候都应避免使用ref ...