反向传播神经网络(有代码)

找了很多资料,觉得就这篇博客讲的最好,原文如下,有非常详细的推导过程。http://www.hankcs.com/ml/back-propagation-neural-network.html ,转载一下。 
代码链接如下https://github.com/hankcs/neural_net/blob/master/bpnn.py 
作者讲解的十分详细了,这里就不多说。

# coding=utf-8
# 反向传播神经网络import math
import randomrandom.seed(0)def rand(a, b):"""创建一个满足 a <= rand < b 的随机数:param a::param b::return:"""return (b - a) * random.random() + adef makeMatrix(I, J, fill=0.0):"""创建一个矩阵(可以考虑用NumPy来加速):param I: 行数:param J: 列数:param fill: 填充元素的值:return:"""m = []for i in range(I):m.append([fill] * J)return mdef randomizeMatrix(matrix, a, b):"""随机初始化矩阵:param matrix::param a::param b:"""for i in range(len(matrix)):for j in range(len(matrix[0])):matrix[i][j] = random.uniform(a, b)def sigmoid(x):"""sigmoid 函数,1/(1+e^-x):param x::return:"""return 1.0 / (1.0 + math.exp(-x))def dsigmoid(y):"""sigmoid 函数的导数:param y::return:"""return y * (1 - y)class NN:def __init__(self, ni, nh, no):# number of input, hidden, and output nodes"""构造神经网络:param ni:输入单元数量:param nh:隐藏单元数量:param no:输出单元数量"""self.ni = ni + 1  # +1 是为了偏置节点self.nh = nhself.no = no# 激活值(输出值)self.ai = [1.0] * self.niself.ah = [1.0] * self.nhself.ao = [1.0] * self.no# 权重矩阵self.wi = makeMatrix(self.ni, self.nh)  # 输入层到隐藏层self.wo = makeMatrix(self.nh, self.no)  # 隐藏层到输出层# 将权重矩阵随机化randomizeMatrix(self.wi, -0.2, 0.2)randomizeMatrix(self.wo, -2.0, 2.0)# 权重矩阵的上次梯度self.ci = makeMatrix(self.ni, self.nh)self.co = makeMatrix(self.nh, self.no)def runNN(self, inputs):"""前向传播进行分类:param inputs:输入:return:类别"""if len(inputs) != self.ni - 1:print 'incorrect number of inputs'for i in range(self.ni - 1):self.ai[i] = inputs[i]for j in range(self.nh):sum = 0.0for i in range(self.ni):sum += ( self.ai[i] * self.wi[i][j] )self.ah[j] = sigmoid(sum)for k in range(self.no):sum = 0.0for j in range(self.nh):sum += ( self.ah[j] * self.wo[j][k] )self.ao[k] = sigmoid(sum)return self.aodef backPropagate(self, targets, N, M):"""后向传播算法:param targets: 实例的类别:param N: 本次学习率:param M: 上次学习率:return: 最终的误差平方和的一半"""# http://www.youtube.com/watch?v=aVId8KMsdUU&feature=BFa&list=LLldMCkmXl4j9_v0HeKdNcRA# 计算输出层 deltas# dE/dw[j][k] = (t[k] - ao[k]) * s'( SUM( w[j][k]*ah[j] ) ) * ah[j]output_deltas = [0.0] * self.nofor k in range(self.no):error = targets[k] - self.ao[k]output_deltas[k] = error * dsigmoid(self.ao[k])# 更新输出层权值for j in range(self.nh):for k in range(self.no):# output_deltas[k] * self.ah[j] 才是 dError/dweight[j][k]change = output_deltas[k] * self.ah[j]#self.wo[j][k] += N * change + M * self.co[j][k] 这里没看懂,稍微修改了一下#self.co[j][k] = changeself.wo[j][k] += N*change# 计算隐藏层 deltashidden_deltas = [0.0] * self.nhfor j in range(self.nh):error = 0.0for k in range(self.no):error += output_deltas[k] * self.wo[j][k]hidden_deltas[j] = error * dsigmoid(self.ah[j])# 更新输入层权值for i in range(self.ni):for j in range(self.nh):change = hidden_deltas[j] * self.ai[i]# print 'activation',self.ai[i],'synapse',i,j,'change',change#self.wi[i][j] += N * change + M * self.ci[i][j]#self.ci[i][j] = changeself.wi[i][j] += N*change# 计算误差平方和# 1/2 是为了好看,**2 是平方error = 0.0for k in range(len(targets)):error = 0.5 * (targets[k] - self.ao[k]) ** 2return errordef weights(self):"""打印权值矩阵"""print 'Input weights:'for i in range(self.ni):print self.wi[i]printprint 'Output weights:'for j in range(self.nh):print self.wo[j]print ''def test(self, patterns):"""测试:param patterns:测试数据"""for p in patterns:inputs = p[0]print 'Inputs:', p[0], '-->', self.runNN(inputs), '\tTarget', p[1]def train(self, patterns, max_iterations=1000, N=0.5, M=0.1):"""训练:param patterns:训练集:param max_iterations:最大迭代次数:param N:本次学习率:param M:上次学习率"""for i in range(max_iterations):for p in patterns:inputs = p[0]targets = p[1]self.runNN(inputs)error = self.backPropagate(targets, N, M)if i % 50 == 0:print 'Combined error', errorself.test(patterns)def main():pat = [[[0, 0], [1]],[[0, 1], [1]],[[1, 0], [1]],[[1, 1], [0]]]myNN = NN(2, 2, 1)myNN.train(pat)if __name__ == "__main__":main()

反向传播神经网络 demo源码相关推荐

  1. 反向传播神经网络(BPNN)的实现(Python,附源码及数据集)

    文章目录 一.理论基础 1.前向传播 2.反向传播 3.激活函数 4.神经网络结构 二.BP神经网络的实现 1.训练过程(BPNN.py) 2.测试过程(test.py) 3.测试结果 4.参考源码及 ...

  2. Java Back Propagation Neural Network(JAVA反向传播神经网络)

    EDITOR: KJ021320 BLOG: http://blog.csdn.net/kj021320 TEAM: I.S.T.O 好久没写东西了,随便记一下~~如果不记录忘记了真是很浪费啊~ 下面 ...

  3. 图片1---前馈神经网络+反向传播神经网络

    声明:  记录自己认为好的图片------以方便后续的使用或者是改进 来源论文:  <一种金融市场预测的深度学习模型: FEPA> (1)前馈神经网络 (2)反向传播神经网络的大致的架构- ...

  4. winserver的consul部署实践与.net core客户端使用(附demo源码)

    前言 随着微服务兴起,服务的管理显得极其重要.都知道微服务就是"拆",把臃肿的单块应用,拆分成多个轻量级的服务,每个服务可以在短周期内重构.迭代.交付.随着微服务的数量增多,因量变 ...

  5. Api demo源码学习(8)--App/Activity/QuickContactsDemo --获取系统联系人信息

    本节通过Content Provider机制获取系统中的联系人信息,注意这个Anctivity直接继承的是ListActivity,所以不再需要setContentView函数来加载布局文件了(我自己 ...

  6. vscode插件开发实践与demo源码

    vscode插件开发实践与demo源码 写在前面 工欲善其事必先利其器.vscode作为优秀的开发工具,给我的日常开发工作提供了极大的便利.其拓展机制更是如此. 但是,最近在做年度专业线任务时,有需要 ...

  7. Api demo源码学习(4)--App/Activity/Dialog --Activity以Dialog形式呈现

    这一节实际上比 Api demo源码学习(2)--App/Activity/Custom Dialog 自定义Activity样式  还要简单一些,在源码学习(2)里,也是让Activity以Dial ...

  8. C# Windows系统音量调节Demo源码

    基于.NET Framework 4.0开发,包含滑块设置音量,键盘F1.F2调节音量. 通过滑块调节系统音量核心代码 /// <summary>/// 滑块设置音量/// </su ...

  9. GEF教程及demo源码

    GEF教程及demo源码下载http://download.csdn.net/download/sidihuo/9695103 GEF教程及demo源码

最新文章

  1. 水仙花数 与 变种水仙花数 的求解 【C语言】
  2. 设计模式 — 行为型模式 — 解释器模式
  3. Linux手动分区步骤
  4. maven工程servlet实例之jar包冲突解决
  5. 线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze
  6. 正式开始liunx学习之旅
  7. 4-2MapReduce的运行流程
  8. Less入门与安装(转)
  9. mysql的max case_MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)
  10. Luogu1007 独木桥
  11. Docker 集群环境实现的新方式
  12. Bailian3247 回文素数【素数+回文】(POJ NOI0113-11)
  13. python写sql语句_Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析...
  14. 推荐一个Oracle数据库学习的网站
  15. 《运筹学》CSU作业答案
  16. 【通过】华为OD机试真题59:叠积木
  17. Win7 IE浏览器的降级和升级
  18. contest17 CF593 div2 ooxxx ooxxx ooooo
  19. 阿里云的服务器,网站域名没有备案时为什么不可以访问?
  20. 世界上最大的联合体GE

热门文章

  1. linux笔记本不关机直接合上,笔记本电脑不关机直接合上行吗
  2. windows7怎么安装python库_如何在Windows 7安装Python2.7
  3. python 替换array中的值_Python五个隐藏的特性,你可能从未听说过
  4. ae中心点重置工具_不懂这些知识,你的AE白学了!
  5. linux系统不关机添加硬盘吗,CentOS中不重启添加硬盘
  6. java build.gradle 详解_java – Gradle构建失败[无法解析配置的所有依赖项’:compile’.]...
  7. java jdwp如何关闭_蚀-本机方法中的致命错误:JDWP没有初始化传输,jvmtiError = AGENT_ERROR_TRANSPORT_INIT(197)...
  8. html excel零不显,Excel数值为0不显示的三种解决方法
  9. 精选四款命令行「神器」:美、快、爽!
  10. 皮一皮:这大概就是年轻的味道...