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程序设计入门(5)类的使用简介
Jun 16 Python
带你了解python装饰器
Jun 15 Python
用python实现对比两张图片的不同
Feb 05 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Python网页正文转换语音文件的操作方法
Dec 09 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
django云端留言板实例详解
Jul 22 Python
python文字转语音的实例代码分析
Nov 12 Python
Python3 webservice接口测试代码详解
Jun 23 Python
Django框架安装及项目创建过程解析
Sep 14 Python
python实现一个简单RPC框架的示例
Oct 28 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 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字符串的编码问题的详细介绍
2013/04/27 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
类之Prototype.js学习
2007/06/13 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
sublime text 3配置使用python操作方法
2017/06/11 Python
Python实现登录接口的示例代码
2017/07/21 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
canvas粒子动画背景的实现示例
2018/09/03 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
美国网上花店:JustFlowers
2017/02/12 全球购物
《钱学森》听课反思
2014/03/01 职场文书
珍惜水资源建议书
2014/03/12 职场文书
财务经理岗位职责
2015/01/31 职场文书
团委副书记工作总结
2015/08/14 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
详解如何用Python实现感知器算法
2021/06/18 Python
Python面向对象之成员相关知识总结
2021/06/24 Python