目录

看鱼书记录5:

数值微分和反向传播都能更新权值的梯度度(严格来说,是损失函数关于权重参数的梯度),但反向传播更加高效。

反向传播就是求偏导(梯度),如何求呢?根据链式法则和输入值来求,具体如下

该点的局部导数是对上一个结点的偏导(从右到左(上一个结点))

加法节点的反向传播将上游的值原封不动地输出到下游(因为对上一个结点求偏导为1,这里的值是指上一个对下一个传递的偏导值)

乘法结点的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游。

加法的反向传播只是将上游的值传给下游,并不需要正向传播的输入信号。但是,乘法的反向传播需要正向传播时的输入信号值。因此,实现乘法节点的反向传播时,要保存正向传播的输入信号。

看懂下面这个例子就知道加法、乘法这个偏导怎么从右边传递到左边了:

箭头下面代表偏导,如2.2代表如何苹果价格(上图苹果100代表它的价格)上升,将对最终总消费额产生2.2倍大小的影响。下面通过代码实现5-14(反向传播求偏导)

1.反向传播求偏导(买两个苹果+税:求导)

import numpy as np

import matplotlib.pyplot as plt

class Mullayer:

def __init__(self):

self.x=None

self.y=None

#前向传播

def forward(self,x,y):

self.x=x

self.y=y

out=x*y

return out

#反向传播,dout是上一个传给下一个结点的偏导数

def backward(self,dout):

#这里乘法层,所有翻转了

dx=dout*self.y

dy=dout*self.x

return dx,dy

apple=100

apple_num=2

tax=1.1

#代表两个结点(对象),要用两个对象哦,不然结果出错(因为输入了不同的输入值)

mul_apple_layer=Mullayer()

mul_tax_layer=Mullayer()

#进行前向传播

apple_price=mul_apple_layer.forward(apple,apple_num)

price=mul_tax_layer.forward(apple_price,tax)

print(price)

#下面进行反向传播求导数

dprice=1

dapple_price,dtax=mul_tax_layer.backward(dprice)

print(dapple_price,dtax)

dapple,dapple_num=mul_apple_layer.backward(dapple_price)

print(dapple,dapple_num)

输出:

220.00000000000003

1.1 200

2.2 110.00000000000001

与图5-14的结果一样

2.加了加法层的BP算法

import numpy as np

import matplotlib.pyplot as plt

#加法结点层

class AddLayer:

def __init__(self):

pass

def forward(self,x,y):

out=x+y

return out

def backward(self,dout):

dx=dout*1

dy=dout*1

return dx,dy

#乘法结点层

class Mullayer:

def __init__(self):

self.x=None

self.y=None

#前向传播

def forward(self,x,y):

self.x=x

self.y=y

out=x*y

return out

#反向传播,dout是上一个传给下一个结点的偏导数

def backward(self,dout):

#这里乘法层,所有翻转了

dx=dout*self.y

dy=dout*self.x

return dx,dy

apple=100

apple_num=2

orange=150

orange_num=3

tax=1.1

#结点对象

mul_apple_layer=Mullayer()

mul_orange_layer=Mullayer()

add_apple_orange_layer=AddLayer()

mul_tax_layer=Mullayer()

#前向传播

apple_price=mul_apple_layer.forward(apple,apple_num)

orange_price=mul_orange_layer.forward(orange,orange_num)

all_price=add_apple_orange_layer.forward(apple_price,orange_price)

price=mul_tax_layer.forward(all_price,tax) #最终价格

#反向传播求偏导

dprice=1

dall_price,dtax=mul_tax_layer.backward(dprice)

dapple_price,dorange_price=add_apple_orange_layer.backward(dall_price)

dorange,dorange_num=mul_orange_layer.backward(dorange_price)

dapple,dapple_num=mul_apple_layer.backward(dapple_price)

print(price)

print(dapple,dorange,dorange_num,dapple_num,dtax)

输出:

715.0000000000001

2.2 3.3000000000000003 165.0 110.00000000000001 650

输出的结果和上图一样,内容和1基本一样,只不过+了加法层

仿射变换:包括一次线性变换和一次平移,分别对应神经网络的加权和运算与加偏置运算。eg:wx+b

3.Softmax+Cross entrop error反向传播

import numpy as np

def softmax(a):

exp_a=np.exp(a)

sum_exp_a=np.sum(exp_a)

y=exp_a/sum_exp_a

return y

#t代表真实训练数据

def cross_entropy_error(y,t):

#y是一维的情况

if y.ndim==1:

#转为二维:shape是(1,t.size)的类型(这里是1,10),而不是一维shape(t.size,)的情况(这里是10,)了

t=t.reshape(1,t.size)

y=y.reshape(1,y.size)

batch_size=y.shape[0] #1

return -np.sum(t*np.log(y+1e-7))/batch_size #就是又多少行(batch_size),就除以多少,这就是小批量来估计整体

class SoftmaxwithLoss:

def __init__(self):

self.loss=None

self.y=None

self.t=None

def forward(self,x,t):

self.t=t

self.y=softmax(x)

self.loss=cross_entropy_error(self.y,self.t)

return self.loss

def backwarrd(self,dout=1):

batch_size=self.t.shape[0]

dx=(self.y-self.t)/batch_size

return dx

a=SoftmaxwithLoss()

x=np.array([3,1,6]) #预测结果

t=np.array([0,1,0])#真实数据(训练数据)

print(a.forward(x,t))

print(a.backwarrd())

输出:

5.054969555278561

[ 0.01570781 -0.33120751 0.31549971]

这里由于预测跟真实相差比较大,所有最终loss(前向传播)也比较大;而由于误差大,所有反向传播的结果返回的也比较大:-0.33,因为这个大的误差会向前面的层传播,所以Softmax层前面的层会从这个大的误差中学习到“大”的内容。

4.总结

步骤1(mini-batch)

从训练数据中随机选择一部分数据。

步骤2(计算梯度)

计算损失函数关于各个权重参数的梯度。

步骤3(更新参数)

将权重参数沿梯度方向进行微小的更新。

步骤4(重复)

重复步骤1、步骤2、步骤3。

本文地址:https://blog.csdn.net/QLBFA/article/details/107576979

希望与广大网友互动??

点此进行留言吧!

python 反传播_纯Python实现反向传播(BP算法)(5)相关推荐

  1. python卡通滤镜_纯Python综合图像处理小工具(3)10种滤镜算法

    滤镜处理是图像处理中一种非常常见的方法.比如photoshop中的滤镜效果,除了自带的滤镜,还扩展了很多第三方的滤镜效果插件,可以对图像做丰富多样的变换:很多手机app实现了实时滤镜功能,最有名的当属 ...

  2. python 山脊图_纯Python绘制艺术感满满的山脊地图,创意满分

    而今天的文章,我们就来一起基于 Python ,配合颜色与字体的选择搭配,使用简短的代码,就可以创作出艺术海报级别的 山脊地图 . 2 基于ridge_map的山脊地图绘制 我们主要使用 matplo ...

  3. python 山脊图_纯Python绘制满满艺术感的山脊地图

    ❝ 本文示例代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes❞ 1 简介 下面的这幅图可能很多读者朋友们都看到 ...

  4. 使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播

    使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播 一.what is 反向传播 二.乘法节点的反向传播 三.加法节点的反向传播 四.加法层和乘法层混合应用 一.what is ...

  5. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  6. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  7. 机器学习入门(14)— 神经网络学习整体流程、误差反向传播代码实现、误差反向传播梯度确认、误差反向传播使用示例

    1. 神经网络学习整体流程 神经网络学习的步骤如下所示. 前提 神经网络中有合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为学习.神经网络的学习分为下面 4 个步骤. 步骤1(mini-ba ...

  8. python数据库应用开发实例_纯Python开发的nosql数据库CodernityDB介绍和使用实例

    看看这个logo,有些像python的小蛇吧 .这次介绍的数据库codernityDB是纯python开发的. 先前用了下tinyDB这个本地数据库,也在一个api服务中用了下,一开始觉得速度有些不给 ...

  9. python递归_纯Python递归计算行列式

    今天做leetcode周赛碰到一个判断三点共线的问题,好在数学系的我马上反应到了行列式,然鹅行列式展开来那么多项,,输错好几次的我直接判了三次罚时,凉凉 趁空闲写了个纯py递归计算行列式的程序,兴许以 ...

最新文章

  1. Windows+Nginx+IIS做图片分布式存储详细步骤
  2. 【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )
  3. Excel插件类库的设计思路
  4. 《转》IIS中配置通配符应用程序映射
  5. ubuntu文件、目录操作基本命令
  6. MySQL sql_cache缓存使用
  7. 音视频技术开发周刊(第131期)
  8. explorer.exe被删除了怎么办?
  9. 基于RxJava2+Retrofit2简单易用的网络请求实现
  10. 电脑如何测网速_测网速小常识
  11. ais信号接收设备_基于USRP的AIS接收机实现
  12. opencv3.4.0在ubuntu16.04上的安装
  13. Python会赶超Java吗_Python 赶超 Java,JavaScript 稳坐第一 | GitHub
  14. Linux Ext2/Ext3/Ext4文件系统
  15. 北京计算机应用中级,计算机应用教程(中级)
  16. 拼接大屏数据展示_4K高清拼接屏大数据点对点显示解决方案
  17. Computer Shader的理解记录
  18. python中abs函数是什么意思_python abs函数怎么用
  19. 挂载WINDOWS虚机镜像
  20. python成都 培训

热门文章

  1. 中国数码相机镜头行业市场供需与战略研究报告
  2. c语言10怎么打开文件,Lecture 10 C语言文件操作
  3. oracle11g增加备库,oracle11g dataguard物理备库搭建(关闭主库cp数据文件到备库)
  4. 主动出击,马斯克欲用 430 亿美元拿下 Twitter
  5. 低代码工具是软件维护的噩梦?
  6. 2021 年中国开源优秀人物揭晓
  7. 2021 年 Windows 成了 Python 开发者的首选
  8. 直播预告 | 腾讯千帆区块链云市场发布会震撼来袭
  9. C语言能够被替换吗?
  10. 赠书 | 如何建设数据中台?看这份企业数据能力测评就够了!