梯度检验
对于一个函数而言,通常由两种梯度计算方法:
- 数值梯度(numerical gradient)
- 解析梯度(analytic gradient)
神经网络的算法使用反向传播计算目标函数关于每个参数的梯度,可以当作是解析梯度
由于计算过程中,参数较多,反向传播计算的梯度很容易产生误差,导致最后的迭代效果很差
故需要通过计算数值梯度,得到梯度的近似值,然后和反向传播得到的梯度及逆行比较,若两者相差很小则证明反向传播的代码是正确的
# coding: utf-8
import numpy as np
from simple_convolution_net import SimpleConvNet
""""""
network = SimpleConvNet(input_dim=(1, 10, 10),
conv_param={'filter_num':10, 'filter_size':3, 'pad':0, 'stride':1},
hidden_size=10, output_size=10, weight_init_std=0.01)
X = np.random.rand(100).reshape((1, 1, 10, 10))
T = np.array([1]).reshape((1,1))
grad_num = network.numerical_gradient(X, T)
grad = network.gradient(X, T)
for key, val in grad_num.items():
print(key, np.abs(grad_num[key] - grad[key]).mean())