0. 前言

上篇文章 通过一个实际的例子说明了神经网络正向传播以及反向传播是如何实现的,以及这个计算的过程是怎么来的,下面想通过代码来实现这个过程 !

1. 代码实现神经网络BP算法

1.1 网络结构

这里的网络结构和相关的数据还是采用上一节中举的例子:

1.2 代码实现
  1. 数据准备
import numpy as np
# 权重
w = [0, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65]
# 偏移
b = [0, 0.35, 0.65]
# 输入数据
x = [0, 5, 10]
# 实际输出
real_o1 = 0.01
real_o2 = 0.99

由于在上边的网络结构的图中,w、bw、bw、b 和 xxx 的下标都是从1开始的,但在数组中下标是从0开始的,所以这里就把数组中的第0项都设置为0.

  1. 激活函数
    激活函数还是选择使用sigmoid函数:
def sigmoid(z):"""激活函数"""result = 1.0 / (1 + np.exp(-z))return result

如果想要验证激活函数写对了没有,可以选择打印自变量为0时的函数值print(sigmoid(0)),如果输出为0.5,就表明是正确的 !

  1. BP过程
    这个BP将正向传播糅合在一起了,即先通过正向传播计算误差(损失),再反向调整权重,代码中的求偏导这些过程,没有用偏导的函数,而是直接求解的,与上篇文章中的整个过程是对应的 !
def bp(w, b, x):"""正向传播:计算误差 + 反向传播:更新权重w"""# 1. 正向传播:计算误差h1 = sigmoid(w[1] * x[1] + w[2] * x[2] + b[1])h2 = sigmoid(w[3] * x[1] + w[4] * x[2] + b[1])h3 = sigmoid(w[5] * x[1] + w[6] * x[2] + b[1])o1 = sigmoid(w[7] * h1 + w[9] * h2 + w[11] * h3 + b[2])o2 = sigmoid(w[8] * h1 + w[10] * h2 + w[12] * h3 + b[2])# 总误差error = 0.5 * np.square(real_o1 - o1) + 0.5 * np.square(real_o2 - o2)# 2. 反向传播:更新权重walpha = 0.5  # 学习率partial_1 = -(real_o1 - o1) * o1 * (1 - o1)partial_2 = -(real_o2 - o2) * o2 * (1 - o2)# 隐藏层到输出层更新后的ww[7] = w[7] - alpha * (partial_1 * h1)w[9] = w[9] - alpha * (partial_1 * h2)w[11] = w[11] - alpha * (partial_1 * h3)w[8] = w[8] - alpha * (partial_2 * h1)w[10] = w[10] - alpha * (partial_2 * h2)w[12] = w[12] - alpha * (partial_2 * h3)# 输入层到隐藏层更新后的ww[1] = w[1] - alpha * (partial_1 * w[7] + partial_2 * w[8]) * h1 * (1 - h1) * x[1]w[2] = w[2] - alpha * (partial_1 * w[7] + partial_2 * w[8]) * h1 * (1 - h1) * x[2]w[3] = w[3] - alpha * (partial_1 * w[9] + partial_2 * w[10]) * h2 * (1 - h2) * x[1]w[4] = w[4] - alpha * (partial_1 * w[9] + partial_2 * w[10]) * h2 * (1 - h2) * x[2]w[5] = w[5] - alpha * (partial_1 * w[11] + partial_2 * w[12]) * h3 * (1 - h3) * x[1]w[6] = w[6] - alpha * (partial_1 * w[11] + partial_2 * w[12]) * h3 * (1 - h3) * x[2]return o1, o2, error, w
  1. 训练预测
    上面相当于是神经网络的一次训练过程(正向+反向),当然一次的训练显然是不够的,只有多次训练后才会愈来愈接近真实值,这里我们进行1000次的迭代,为了更好地观察变化,打印每一次的预测值、总误差以及权重
for i in range(1000):"""迭代1000次并查看结果"""o1, o2, error, w = bp(w, b, x)print("第{}次迭代:,预测值为:({},{}),总误差为:{},权重为:{}".format(i + 1, o1, o2, error, w))
  1. 部分输出
第10次迭代:,预测值为:(0.6628660388080178,0.9081950647466669),总误差为:0.21646305603033708,权重为:[0, 0.07610804313549309, 0.10221608627098615, 0.190408353976401, 0.230816707952802, 0.2966262198756943, 0.34325243975138864, -0.10761926674458068, 0.48082572625849623, -0.08313002065013501, 0.5851569288735385, 0.004809785641267411, 0.6858692203369033]
第100次迭代:,预测值为:(0.07434400783631397,0.945689792404305),总误差为:0.003051772920806612,权重为:[0, 0.1864089921965286, 0.3228179843930571, 0.23965760338038153, 0.3293152067607631, 0.3108135454268529, 0.3716270908537057, -1.0850594180486732, 0.6369390234749703, -1.0964255065626485, 0.7437262476913241, -1.021016770363603, 0.8457592597174984]
第1000次迭代:,预测值为:(0.022980751228480648,0.9776666549668452),总误差为:0.0001603056510812724,权重为:[0, 0.21491564150393844, 0.3798312830078768, 0.2628474338690681, 0.3756948677381351, 0.3231962973308205, 0.3963925946616401, -1.489582973447391, 0.9415807254516165, -1.5016742512504941, 1.0488846306039166, -1.4274137106156801, 1.1517468039990286]

这里截取了迭代到10、100、1000次时的对应的数据,可以观察到时越发趋近于真实值的,且总的误差也在变小 !

神经网络反向传播BP算法代码实现相关推荐

  1. 神经网络——反向传播BP算法应用案例

    案例应用(一)--20个样本的两层(单隐藏层)神经网络 知识点: 1.tolist() 链接:http://blog.csdn.net/akagi_/article/details/76382918 ...

  2. 神经网络反向传播BP算法举例说明

    0. 前言 上篇博客对BP算法的大致步骤进行了总结,本篇博客将通过一个具体的例子来模拟一下这个算法的实现过程 ! 1. BP算法例子说明 1.1 网络结构 1.2 权重及偏移 w = ( 0.1 , ...

  3. 深度学习图像处理目标检测图像分割计算机视觉 04--神经网络与误差反向传播BP算法

    深度学习图像处理目标检测图像分割计算机视觉 04--神经网络与误差反向传播BP算法 摘要 一.神经元 二.前馈网络 2.1 Delta学习规则 2.2 目标函数J(w) 三.误差反向传播算法(BP算法 ...

  4. 反向传播BP 算法之一种直观的解释

    0. 前言 之前上模式识别课程的时候,老师也讲过 MLP 的 BP 算法, 但是 ppt 过得太快,只有一个大概印象.后来课下自己也尝试看了一下 stanford deep learning 的 wi ...

  5. 多层感知机Perceptron反向传播BP算法推导(Back Propagation)

    看了很多BP的推导,都不够简洁直观,这里总结一下.多层Perceptron就是全连接的网络,定义第l层的输入为x(l)x^{(l)}x(l),那么全连接的线性输出z(l)=W(l)x(l)+b(l)z ...

  6. 神经网络反向传播算法推导

    反向传播是多数神经网络进行参数更新的基本方法,它的本质是巧妙利用了高数中的链式法则,下面对这一方法进行推导: (1)符号说明 :神经元的激活函数 :神经网络的权重向量 :神经网络的偏置向量 :某层的输 ...

  7. 【机器学习笔记】神经网络反向传播算法 推导

    神经网络反向传播算法 推导 (一) 概念及基本思想 (二)信息的前向传播 (三)误差反向传播 (1)输出层的权重参数更新 (2)隐藏层的权重参数更新 (3)输出层与隐藏层的偏置参数更新 (4)反向传播 ...

  8. cnn卷积神经网络反向传播,cnn正向传播和反向传播

    如何对CNN网络的卷积层进行反向传播 在多分类中,CNN的输出层一般都是Softmax.RBF在我的接触中如果没有特殊情况的话应该是"径向基函数"(RadialBasisFunct ...

  9. 神经网络反向传播梯度计算数学原理

    [神经网络]反向传播梯度计算数学原理 1 文章概述 本文通过一段来自于Pytorch官方的warm-up的例子:使用numpy来实现一个简单的神经网络.使用基本的数学原理,对其计算过程进行理论推导,以 ...

  10. 神经网络反向传播的作用,双向传播的神经网络

    如何理解神经网络里面的反向传播算法 反向传播算法(Backpropagation)是目前用来训练人工神经网络(ArtificialNeuralNetwork,ANN)的最常用且最有效的算法. 其主要思 ...

最新文章

  1. springboot 使用Jenkins实现自动化部署
  2. 机器学习笔记:岭回归(L2正则化)
  3. Linux安装PHP报错Sorry, I cannot run apxs. Possible reasons follow:
  4. Linux系统CentOS 7配置Spring Boot运行环境
  5. shell中的正则表达式
  6. 【概率证明】—— sum and product rules of probability
  7. 阿克曼函数实现(Java代码)
  8. android音标,安卓系统如何正确显示音标
  9. 44万条数据揭秘:如何成为网易云音乐评论区的网红段子手?
  10. 工字型钢弹性截面模量计算公式_截面模量计算方法
  11. 服务器被劫持怎么修复不了,电脑DNS被劫持怎么修复?电脑dns被劫持的完美解决方法...
  12. 河北省计算机对口试题,河北省对口计算机试题及答案.doc
  13. 探寻中国便携式医疗电子市场的机遇与挑战
  14. Unity打包后窗口在PC端不按照设置的大小显示
  15. 【RC延迟电路 RC充电电路】 multisim 14.0仿真 参数计算
  16. 如何实现GPRS 拨号上网?
  17. 详解 Redis 应用场景及原理
  18. python硬币面值组合_【算法27】硬币面值组合问题
  19. 【错误记录】Android Studio 中 Gradle 配置报错 ( Can‘t determine type for tag ‘<item name=““ type=“String“>)
  20. GNU m4 教程[转]

热门文章

  1. druid数据库连接池 数据库配置密码加密
  2. Sketch for Mac(矢量绘图工具)
  3. hdu6184 Counting Stars(三元环统计)
  4. 服务器注册表修复,修复注册表,重连服务器
  5. 社会网络分析:探索人人网好友推荐系统
  6. Kaldi语音识别:aidatatang_asr开源模型实现中文语音识别详细及遇到的问题【亲自跑通】
  7. Postman 中文包使用
  8. 苹果手机设置导入喜欢的音乐作为铃声
  9. Office办公软件三十而立,从一花到多花(上)
  10. 苹果账号调查事件始末,Apple审核流程或有变