【深度学习】4-2 误差反向传播法 - 简单层的实现(层的介绍)

这篇具有很好参考价值的文章主要介绍了【深度学习】4-2 误差反向传播法 - 简单层的实现(层的介绍)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

下面把构建神经网络的“层”实现为一个类。这里所说的“层”是神经网络中功能的单位。

下面先从一些简单的层开始介绍

乘法层的实现

层的实现中有两个共通的方法(接口)forward()backward()
forward() 对应正向传播
backward() 对应反向传播

现在来实现乘法层。看下面代码

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

	def backward(self, dout):
		dx = dout*self.y # 翻转x和y
		dy = dout*self.x

		return dx,dy

backward()将从上游传来的导数(dout)乘以正向传播的翻转值,然后传给下游。

下面就使用MulLayer实现前面的购买的例子(2个苹果和消费税)。看图:
【深度学习】4-2 误差反向传播法 - 简单层的实现(层的介绍)

通过乘乘法层,上图的正向传播可以像下面这样实现:

apple = 100
apple_num = 2
tax = 1.1

# layer
mul_apple_layer = MulLayer()
mul_tax_layer = MulLayer()

#forward
apple_price = mul_apple_layer.forward(apple, apple_num)
price = mul_tax_layer.forward(apple_price ,tax)
print(price)

求各个变量的导数可由backward()求出

#backward
dprice = 1
dapple_price, dtax = mul_tax_layer.backward(dprice)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)

print(dapple, dapple_num, dtax)

此外,要注意backward()的参数中需要输入“关于正向传播时的输出变量的导数”。

加法层的实现

下面来实现加法节点的加法层

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

下面使用加法层和乘法层,实现下图的例子:
【深度学习】4-2 误差反向传播法 - 简单层的实现(层的介绍)

实现代码如下:

apple = 100
apple_num = 2
orange = 150
orange_num = 3
tax = 1.1

# layer
mul_apple_layer = MulLayer()
mul_orange_layer = MulLayer()
add_apple_orange_layer = AddLayer()
mul_tax_layer = MulLayer()

# forward
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)

#backward
dprice = 1
dall_price, dtax = mul_tax_layer.backward(dprice)
dapple_price, dorange_price = add_apple_orange_layer.backward(dall_price)
dorange, dorange_num = nul_orange_layer.backward(dorange_price)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)

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

综上,计算图中层的实现非常简单,使用这些层可以进行复杂的导数计算

激活函数层的实现

这里把构成神经网络的层实现为一个类。先来实现激活函数的ReLU层和Sigmoid层。

现在来实现ReLU层。在神经网络的层的实现中,一般假定 forward()和tackerd0 的参数是NumPy数组。代码如下:

【深度学习】4-2 误差反向传播法 - 简单层的实现(层的介绍)

class Relu:
	def __init__(self):
		self.mask = None

	def forward(self, x):
		self.mask = (x <= 0)
		out = x.copy()
		out[self.mask] = 0

		return out

	def backward(self, dout):
		dout[self.mask] = 0
		dx = dout
		
		return dx
	

Relu类有实例变量mask。这个变量mask是由True/False构成的NumPy数组,它会把正向传播时的输人x的元素中小于等于0的地方保存为True其他地方(大于0的元素)保存为False。如下例所示,mask变量保存了由True/False构成的NumPy数组

>>> x= np.array( [[1.0,-0.5],[-2.03.0]] )
>>>print(x)
[[1. -0.5]
[-23.]]
>>>mask=(x<=0)
>>>print(mask)
[[False True]
[True False]]

如果正向传播时的输入值小于等于0, 则反向传播的值为0,
反向传播中会使用正向传播时保存的mask,
将从上游传来的dout的mask中的元素为True的地方设为0
。 (关键思路)

Sigmoid层

计算图表示的话,如下:
【深度学习】4-2 误差反向传播法 - 简单层的实现(层的介绍)

Sigmoid层包括反向传播的计算图如下:

【深度学习】4-2 误差反向传播法 - 简单层的实现(层的介绍)

上面可以简化为

【深度学习】4-2 误差反向传播法 - 简单层的实现(层的介绍)

这样通过对节点进行集约化,可以不用在意Sigmoid层中琐碎的细节,而只需要专注它的输入和输出

另外,该结果可以进一步整理如下:
【深度学习】4-2 误差反向传播法 - 简单层的实现(层的介绍)

下面用Python来实现Sigmoid层,代码如下:文章来源地址https://www.toymoban.com/news/detail-492083.html

class Sigmoid:
	def __init__(self):
		self.out = None

	def forward(self,x):
		out = 1 / (1+np.exp(-x))
		self.out = out
		return out

	def backward(self, dout):
		dx = dout * (1.0 - self.out)*self.out
		return dx

到了这里,关于【深度学习】4-2 误差反向传播法 - 简单层的实现(层的介绍)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《动手学深度学习 Pytorch版》 8.7 通过时间反向传播

    本节主要探讨梯度相关问题,因此对模型及其表达式进行了简化,进行如下表示: h t = f ( x t , h t − 1 , w h ) o t = g ( h t , w o ) begin{align} h_t=f(x_t,h_{t-1},w_h)\\\\ o_t=g(h_t,w_o) end{align} h t ​ o t ​ ​ = f ( x t ​ , h t − 1 ​ , w h ​ ) = g ( h t ​ , w o ​ ) ​ ​ 参数字典: t t t 表示时间步

    2024年02月07日
    浏览(31)
  • 【深度学习基础】反向传播BP算法原理详解及实战演示(附源码)

    需要源码请点赞关注收藏后评论区留言私信~~~ 神经网络的设计灵感来源于生物学上的神经网络。如图所示,每个节点就是一个神经元,神经元与神经元之间的连线表示信息传递的方向。Layer 1表示输入层,Layer 2、Layer 3表示隐藏层,Layer 4表示输出层。我们希望通过神经网络,

    2024年01月21日
    浏览(28)
  • 【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture04反向传播

    lecture04反向传播 课程网址 Pytorch深度学习实践 部分课件内容: pytorch的机制是动态计算图, tensor里面既有data也有gradient

    2024年02月22日
    浏览(34)
  • 深度学习之反向传播

    (在pytorch包中)Tensor数据成员:data(存放数据w,也是Tensor变量,但是取data不会构建计算图)和grad(存放梯度loss对w的导,调用bacward之后grad也是个Tensor,每次引用结束要zero) backward会释放计算图,每一次运行神经网络时计算图可能是不同的,所以没进行一次反向传播就释放

    2024年02月16日
    浏览(24)
  • “深度学习”学习日记:Tensorflow实现VGG每一个卷积层的可视化

    2023.8.19 深度学习的卷积对于初学者是非常抽象,当时在入门学习的时候直接劝退一大班人,还好我坚持了下来。可视化时用到的图片(我们学校的一角!!!)以下展示了一个卷积和一次Relu的变化  作者使用的GPU是RTX 3050ti 在这张图像上已经出现了Cuda out of memory了。防止其他

    2024年02月11日
    浏览(30)
  • 机器学习 day27(反向传播)

    1. 导数 函数在某点的导数为该点处的斜率,用height / width表示,可以看作若当w增加ε,J(w,b)增加k倍的ε,则k为该点的导数 2. 反向传播 tensorflow中的计算图,由有向边和节点组成。从左向右为正向传播,神经网络模型使用正向传播来输出结果 从右向左为反向传播,tensorflow使用

    2024年02月16日
    浏览(36)
  • 机器学习之前向传播(Forward Propagation)和反向传播(Back propagation)

    前向传播(Forward Propagation)和反向传播(Back propagation)是深度学习中神经网络训练的两个关键步骤。 前向传播(Forward Propagation) : 定义 :前向传播是指从神经网络的输入层到输出层的过程,通过输入数据和当前的模型参数,计算网络的输出。 步骤 :在前向传播中,数据

    2024年02月10日
    浏览(40)
  • 机器学习17:训练神经网络-反向传播算法

    反向传播算法对于快速训练大型神经网络至关重要。本文将介绍算法的工作原理。 目录 1.简单的神经网络 2.激活函数 3.错误函数 4.正向传播 4.1 更新隐藏层 5.反向传播 5.1 求导数

    2024年02月12日
    浏览(43)
  • 【机器学习300问】71、神经网络中前向传播和反向传播是什么?

            我之前写了一篇有关计算图如何帮助人们理解反向传播的文章,那为什么我还要写这篇文章呢?是因为我又学习了一个新的方法来可视化前向传播和反向传播,我想把两种方法总结在一起,方便我自己后续的复习。对了顺便附上往期文章的链接方便回顾: 【机器

    2024年04月17日
    浏览(53)
  • 【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)

    反向传播(back propagation)是一种用于训练神经网络的算法,其作用是计算神经网络中每个参数对损失函数的影响,从而进行参数更新,使得神经网络的预测结果更加准确。 具体来说,反向传播算法首先通过 前向传播 计算神经网络的预测结果,并与实际结果进行比较,得到

    2024年02月04日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包