python里反向传播算法详解


Posted in Python onNovember 22, 2020

反向传播的目的是计算成本函数C对网络中任意w或b的偏导数。一旦我们有了这些偏导数,我们将通过一些常数 α的乘积和该数量相对于成本函数的偏导数来更新网络中的权重和偏差。这是流行的梯度下降算法。而偏导数给出了最大上升的方向。因此,关于反向传播算法,我们继续查看下文。

我们向相反的方向迈出了一小步——最大下降的方向,也就是将我们带到成本函数的局部最小值的方向。

图示演示:

python里反向传播算法详解

反向传播算法中Sigmoid函数代码演示:

# 实现 sigmoid 函数
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
# sigmoid 导数的计算
return sigmoid(x)*(1-sigmoid(x))

反向传播算法中ReLU 函数导数函数代码演示:

def relu_derivative(x): # ReLU 函数的导数
d = np.array(x, copy=True) # 用于保存梯度的张量
d[x < 0] = 0 # 元素为负的导数为 0
d[x >= 0] = 1 # 元素为正的导数为 1
return d

实例扩展:

BP反向传播算法Python简单实现

import numpy as np

# "pd" 偏导
def sigmoid(x):
  return 1 / (1 + np.exp(-x))

def sigmoidDerivationx(y):
  return y * (1 - y)


if __name__ == "__main__":
  #初始化
  bias = [0.35, 0.60]
  weight = [0.15, 0.2, 0.25, 0.3, 0.4, 0.45, 0.5, 0.55]
  output_layer_weights = [0.4, 0.45, 0.5, 0.55]
  i1 = 0.05
  i2 = 0.10
  target1 = 0.01
  target2 = 0.99
  alpha = 0.5 #学习速率
  numIter = 10000 #迭代次数
  for i in range(numIter):
    #正向传播
    neth1 = i1*weight[1-1] + i2*weight[2-1] + bias[0]
    neth2 = i1*weight[3-1] + i2*weight[4-1] + bias[0]
    outh1 = sigmoid(neth1)
    outh2 = sigmoid(neth2)
    neto1 = outh1*weight[5-1] + outh2*weight[6-1] + bias[1]
    neto2 = outh2*weight[7-1] + outh2*weight[8-1] + bias[1]
    outo1 = sigmoid(neto1)
    outo2 = sigmoid(neto2)
    print(str(i) + ", target1 : " + str(target1-outo1) + ", target2 : " + str(target2-outo2))
    if i == numIter-1:
      print("lastst result : " + str(outo1) + " " + str(outo2))
    #反向传播
    #计算w5-w8(输出层权重)的误差
    pdEOuto1 = - (target1 - outo1)
    pdOuto1Neto1 = sigmoidDerivationx(outo1)
    pdNeto1W5 = outh1
    pdEW5 = pdEOuto1 * pdOuto1Neto1 * pdNeto1W5
    pdNeto1W6 = outh2
    pdEW6 = pdEOuto1 * pdOuto1Neto1 * pdNeto1W6
    pdEOuto2 = - (target2 - outo2)
    pdOuto2Neto2 = sigmoidDerivationx(outo2)
    pdNeto1W7 = outh1
    pdEW7 = pdEOuto2 * pdOuto2Neto2 * pdNeto1W7
    pdNeto1W8 = outh2
    pdEW8 = pdEOuto2 * pdOuto2Neto2 * pdNeto1W8

    # 计算w1-w4(输出层权重)的误差
    pdEOuto1 = - (target1 - outo1) #之前算过
    pdEOuto2 = - (target2 - outo2) #之前算过
    pdOuto1Neto1 = sigmoidDerivationx(outo1)  #之前算过
    pdOuto2Neto2 = sigmoidDerivationx(outo2)  #之前算过
    pdNeto1Outh1 = weight[5-1]
    pdNeto2Outh2 = weight[7-1]

    pdEOuth1 = pdEOuto1 * pdOuto1Neto1 * pdNeto1Outh1 + pdEOuto2 * pdOuto2Neto2 * pdNeto1Outh1
    pdOuth1Neth1 = sigmoidDerivationx(outh1)
    pdNeth1W1 = i1
    pdNeth1W2 = i2
    pdEW1 = pdEOuth1 * pdOuth1Neth1 * pdNeth1W1
    pdEW2 = pdEOuth1 * pdOuth1Neth1 * pdNeth1W2
    pdNeto1Outh2 = weight[6-1]
    pdNeto2Outh2 = weight[8-1]
    pdOuth2Neth2 = sigmoidDerivationx(outh2)
    pdNeth2W3 = i1
    pdNeth2W4 = i2
    pdEOuth2 = pdEOuto1 * pdOuto1Neto1 * pdNeto1Outh2 + pdEOuto2 * pdOuto2Neto2 * pdNeto2Outh2
    pdEW3 = pdEOuth2 * pdOuth2Neth2 * pdNeth2W3
    pdEW4 = pdEOuth2 * pdOuth2Neth2 * pdNeth2W4
    #权重更新
    weight[1-1] = weight[1-1] - alpha * pdEW1
    weight[2-1] = weight[2-1] - alpha * pdEW2
    weight[3-1] = weight[3-1] - alpha * pdEW3
    weight[4-1] = weight[4-1] - alpha * pdEW4
    weight[5-1] = weight[5-1] - alpha * pdEW5
    weight[6-1] = weight[6-1] - alpha * pdEW6
    weight[7-1] = weight[7-1] - alpha * pdEW7
    weight[8-1] = weight[8-1] - alpha * pdEW8
    # print(weight[1-1])
    # print(weight[2-1])
    # print(weight[3-1])
    # print(weight[4-1])
    # print(weight[5-1])
    # print(weight[6-1])
    # print(weight[7-1])
    # print(weight[8-1])

到此这篇关于python里反向传播算法详解的文章就介绍到这了,更多相关python里反向传播算法是什么内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python升级提示Tkinter模块找不到的解决方法
Aug 22 Python
python数据结构之图深度优先和广度优先实例详解
Jul 08 Python
python魔法方法-属性转换和类的表示详解
Jul 22 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
Python中实现输入超时及如何通过变量获取变量名
Jan 18 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
Feb 18 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
Mar 03 Python
怎么快速自学python
Jun 22 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 Python
详解如何使用Pytest进行自动化测试
Jan 14 Python
Python调用SMTP服务自动发送Email的实现步骤
Feb 07 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 Python
python动态规划算法实例详解
Nov 22 #Python
python全栈开发语法总结
Nov 22 #Python
scrapy在python爬虫中搭建出错的解决方法
Nov 22 #Python
一篇文章教你用python画动态爱心表白
Nov 22 #Python
python中scrapy处理项目数据的实例分析
Nov 22 #Python
python eventlet绿化和patch原理
Nov 21 #Python
python 实用工具状态机transitions
Nov 21 #Python
You might like
php 破解防盗链图片函数
2008/12/09 PHP
防止用户利用PHP代码DOS造成用光网络带宽
2011/03/01 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
解析Javascript中中括号“[]”的多义性
2013/12/03 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
JS实现的简单折叠展开动画效果示例
2018/04/28 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
在windows系统中实现python3安装lxml
2016/03/23 Python
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
使用CSS3实现字体颜色渐变的实现
2020/08/10 HTML / CSS
蔬菜基地的创业计划书
2014/01/06 职场文书
幼儿园保育员辞职信
2014/01/12 职场文书
优秀教师单行材料
2014/12/16 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书
关于MySQL中的 like操作符详情
2021/11/17 MySQL
MySQL Server 层四个日志
2022/03/31 MySQL