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获得时间的实例说明
Mar 25 Python
Linux下将Python的Django项目部署到Apache服务器
Dec 24 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
python实时监控cpu小工具
Jun 21 Python
使用python实现快速搭建简易的FTP服务器
Sep 12 Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
Python插入Elasticsearch操作方法解析
Jan 19 Python
pytorch MSELoss计算平均的实现方法
May 12 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
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
详解vue 命名视图
2019/08/14 Javascript
koa-passport实现本地验证的方法示例
2020/02/20 Javascript
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
python中OrderedDict的使用方法详解
2017/05/05 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
Python之循环结构
2019/01/15 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
大学生优秀班干部事迹材料
2014/05/26 职场文书
2014年督导工作总结
2014/11/19 职场文书
岗位聘任报告
2015/03/02 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
立春观后感
2015/06/18 职场文书
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python