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的Django框架中更新数据库数据的方法
Jul 17 Python
老生常谈python之鸭子类和多态
Jun 13 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
Python3的socket使用方法详解
Feb 18 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 Python
python-xpath获取html文档的部分内容
Mar 06 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 Python
浅谈Python协程asyncio
Jun 20 Python
python之django路由和视图案例教程
Jul 26 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 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
windows下安装php的memcache模块的方法
2015/04/07 PHP
php计算税后工资的方法
2015/07/28 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
JavaScript Date对象使用总结
2009/05/14 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
Angular组件化管理实现方法分析
2017/03/17 Javascript
Angular 4环境准备与Angular cli创建项目详解
2017/05/27 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
使用JavaScript破解web
2018/09/28 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
vue 实现图片懒加载功能
2020/12/31 Vue.js
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
python输出pdf文档的实例
2020/02/13 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
社区维稳工作方案
2014/06/06 职场文书
个人授权委托书范文
2014/09/21 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
运动与健康自我评价
2015/03/09 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL
Java界面编程实现界面跳转
2022/06/16 Java/Android