深度学习与图像识别:原理与实践 笔记Day_13

误差反向传播

1、激活函数层的实现

1.1 Relu反向传播实现

代码如下:

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

    def forward(self, x):
        self.x = np.maximum(0,x)
        out = self.x

        return out

    # dout 为上一层传过来的导数
    def backward(self, dout):
        dx = dout
        dx[self.x <=0] =0
        return dx

1.2 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 * self.out *(1-self.out)
        return dx

2、Affine层的实现(全连接层)

Affine层的一般形式是y = f(W*x + b),其中x是层输入,w是参数,b是一个偏置量,f是一个非线性激活函数。

对于X(矩阵)的求导,可以参考如下公式,需要注意的是,X和 \frac{\partial L}{\partial X}形状相同,W和 \frac{\partial L}{\partial W}形状相同

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​    ​​​​​ \frac{\partial L}{\partial X} = \frac{\partial L}{\partial Y}\cdot \frac{\partial Y}{\partial X} =\frac{\partial L}{\partial Y}\cdot W^T

                                                    \frac{\partial L}{\partial W} = \frac{\partial L}{\partial Y}\cdot \frac{\partial Y}{\partial W} =X^T \cdot \frac{\partial L}{\partial Y}

                                                    \frac{\partial L}{\partial b} = \frac{\partial L}{\partial Y} \cdot \frac{\partial Y}{\partial b} = \frac{\partial L}{\partial Y} \cdot 1

代码实现如下:

class Affine:
    def __init__(self, W, b):
        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)
        self.dW = np.dot(self.x.T, dout)
        self.db = np.sum(dout, axis=0)
        return dx

3、Softmaxwithloss层的实现

假设网络最后一层的输出为z,经过Softmax后输出为p,真实标签为y(ont-hot编码),其中C表示有C个类别,那么损失函数为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​    L = -\sum_{i=1}^{C}y_ilogp_i

因为p是z经过Softmax函数计算后的输出,即p=softmax(z),其中

                                                            P_i = \frac{e_zi}{\sum_{k=1}^{C}e^{z_k}}

Loss对z的求导为:

                                                             \frac{\partial L}{\partial z} = p -y

代码实现如下:

class SoftmaxWithLoss():
    def __init__(self):
        self.loss = None
        self.p = None
        self.y = None
    
    def forward(self,x,y):
        self.y = y
        self.p = softmax(x)
        self.loss = cross_entropy_error(self.p,self.y)
        return self.loss
    
    def backward(self, dout= 1):
        batch_size = self.y.shape[0]
        dx = (self.p - self.y) / batch_size
        return dx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值