激活层函数和affine层的反向传播

这篇博客介绍了深度学习中两个关键的计算层——ReLU和Sigmoid的正向传播及反向传播实现。ReLU层在正向传播时将输入小于等于0的部分置为0,反向传播时相应位置的梯度设为0。Sigmoid层通过指数函数实现激活,并在反向传播时利用链式法则更新梯度。此外,还详细阐述了仿射变换(Affine)层的前向和反向传播过程,该层用于神经网络中的矩阵乘法运算。这些基本操作是理解神经网络训练过程的基础。
摘要由CSDN通过智能技术生成

激活层函数和affine层的反向传播

在这里插入图片描述

import numpy as np
#Relu函数实现带反向传播
class Relu:
    def __init__(self):
        self.mask=None

    def forward(self,x):
        self.mask=(x<=0)
        out=x.copy()                    #复制x中的所有元素
        out[self.mask]=0

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

        return dx
#如果正向传播时的输人值小于等于0.则反向传播的值为0。因此,反向传播中会便用正问传播时保存的mask,将从上游传来的doutmask中的元素为True的地方设为0。

在这里插入图片描述

#Sigmoid函数带反向传播
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

#这个实现中,正向传播时将输出保存在了实例变量out中。然后反向传播时,使用该变量out进行计算。

在这里插入图片描述

#神经网络的正向传播过程中的矩阵乘积运算在几何学领域称作仿射变换(affine)。因此这里将进行仿射变换的处理实现为affine层。

class Affine:
    def __init__(self):
        self.W=W
        self.b=b
        self.x=None
        self.dW=None
        self.db=None

    def forward(self,x):
        self.x=x
        out=np.dot(x,self.W)+self.b

        return out

    def backward(self,dout):
        dx=np.dot(dout,self.W.T)                       #在numpy模块下.T表示转置矩阵
        self.dW=np.dot(self.x.T,dout)
        self.db=np.sum(dout,axis=0)
        return dx

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值