动手实现深度神经网络3 增加误差反向传播计算梯度
在这一部分中我们利用误差反向传播来计算梯度
,误差反向传播计算梯度的速度大大超过了之前采用的数值微分发法。经过这次改进,我们的神经网络就能以很快的速度和较高的准确率完成MNIST数据集手写数字识别啦!
1.理解误差反向传播
关于误差反向传播的理论和使用计算图推导理解的过程,我之前的文章:Python深度学习入门笔记 2
理解误差反向传播&用python实现自动微分中已经介绍地很详细了啦,如果你对误差反向传播还不了解,就先去看看我这两篇文章吧。
2.代码实现
在我们的两层神将网络类中添加一个方法,如下。
def gradient_BP(self,x,t):
w1, w2 = self.params['w1'], self.params['w2']
b1, b2 = self.params['b1'], self.params['b2']
grads = {
}
batch_num = x.shape[0]
# 正向传播 forward
a1=np.dot(x,w1)+b1
z1=sigmoid(a1)
a2=np.dot(z1,w2)+b2
y=softmax(a2)
# 反向传播 backward
#一
dy=(y-t)/batch_num
#二
grads['b2'