Assignment 2 | FullyConnectedNets
gradient check函数的不同实现
到目前为止用到了三个gradient check函数,分别是:grad_check_sparse,eval_numerical_gradient,eval_numerical_gradient_array。
eval_numerical_gradient
def eval_numerical_gradient(f, x, h=0.00001)
f = lambda W: net.loss(X, y, reg=0.05)[0]
param_grad_num = eval_numerical_gradient(f, net.params[param_name])
这里,f函数是net.loss,返回值是一个数字。
eval_numerical_gradient_array
def eval_numerical_gradient_array(f, x, df, h=1e-5):
grad = np.zeros_like(x)
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
ix = it.multi_index
oldval = x[ix]
x[ix] = oldval + h
fxph = f(x).copy()
x[ix] = oldval - h
fxmh = f(x).copy()
x[ix] = oldval
grad[ix] = np.sum((fxph - fxmh) * df)/ (2 * h)
it.iternext()
return grad
dx_num = eval_numerical_gradient_array(lambda z: affine_forward(x, w, b)[0], x, dout)
这里f函数是affine_forward,返回值out是一个矩阵。所以,要对计算出函数值后, 要对其进行深拷贝:
fxph = f(x).copy()
并且,每次循环算出的仅仅是对x中的一项进行的微分,其结果也是一个数字,并且
dx

本文详细探讨了深度学习中全连接网络的梯度检查,包括eval_numerical_gradient、eval_numerical_gradient_array和grad_check_sparse三种实现。此外,讨论了Solver函数的实现,强调了每层权重配置独立的重要性。在训练过程中,注意到五层网络相对于三层网络对初始化尺度更敏感,AdaGrad更新规则可能导致学习速率过小。最后,分享了训练良好FC网络的步骤,包括调整学习率、权重尺度和正则化等参数。
最低0.47元/天 解锁文章
693

被折叠的 条评论
为什么被折叠?



