用python实现两层的bp神经网络

用python实现两层的bp神经网络

关键代码

正向传播,计算loss

    h1 = np.maximum(0,np.dot(X, W1) + b1) # 计算第一个隐层的激活数据(NxH)
    scores=np.dot(h1, W2) + b2 # 神经元输出(NxC)
    scores = scores - np.reshape(np.max(scores,axis=1),(N,-1))#NxC
    #scores中的每个元素减去这行的最大值
    #axis=1按照列标签向下执行
    p = np.exp(scores)/np.reshape(np.sum(np.exp(scores),axis=1),(N,-1))#NxC
    #scoes中e每个元素除以e每行元素之和
    loss = -sum(np.log(p[np.arange(N),y]))/N
    #loss是一个数,取对数之后求和
    loss += 0.5*reg*np.sum(W1*W1)+0.5*reg*np.sum(W2*W2)
    #正则化

反向传播,更新权值

dscores = p
    dscores[range(N),y]-=1.0#NxC
    #这个有公式推导的,就是这个样子,p中这个类别中的元素减去这个类别的
    dscores/=N#loss中除以了n所以这里也要除
    dW2 = np.dot(h1.T,dscores)#HxC
    dh2 = np.sum(dscores,axis=0,keepdims=False)#C*1
    #对h2[i]求导的时候,因为scores中的每一列都包含了h2[i],所以得把这一列累加起来
    #然后弄成一个列向量
    da2 = np.dot(dscores,W2.T)#NxH
    #此时是经过relu之后的
    da2[h1<=0]=0#NxH
    #relu'=max(0,1)
    dW1 = np.dot(X.T,da2)#DxH
    dh1 = np.sum(da2,axis=0,keepdims=False)#Hx1
    #隐藏层的偏置项
    dW2 += reg*W2#正则化
    dW1 += reg*W1#正则化
    grads['W1']=dW1
    grads['b1']=dh1
    grads[
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值