Я сейчас пишу код для глубокой нейронной сети.Я реализовал вперед porp и обратно проп.Чтобы проверить, что мое обратное распространение было хорошо сделано, я реализовал градиентную проверку.Разница между аппроксимациями градиентов и градиентов, полученных в backprop, всегда велика, но всегда около одного и того же числа, даже если инициализация весов и смещений случайна.Это всегда дает мне число около 0,6. Есть идеи, в чем проблема?
Код:
def grad_check (gradients, parameters,X,Y,activation_functions, layers_dims,pRelu ,epsilon=1e-7):
theta,positions = dic_to_vector(parameters)
grads_vector,_ = dic_to_vector(gradients,False)
nparams = len (theta)
n_att = X.shape[0]
gradapprox = np.zeros((nparams,1))
for i in range(0,nparams):
thetap = np.array(theta)
thetap[i]=thetap[i]+epsilon
thetam = np.array(theta)
thetam[i]=thetam[i]-epsilon
ALp,_= forward_prop(X,vector_to_dic(thetap,positions,layers_dims,n_att),activation_functions,pRelu)
ALm,_ = forward_prop(X,vector_to_dic(thetam,positions,layers_dims,n_att),activation_functions,pRelu)
Jp = compute_cost(ALp,Y)
Jm = compute_cost(ALm,Y)
derapprox = (Jp-Jm)/(2*epsilon)
gradapprox[i]=derapprox
numerator = np.linalg.norm(grads_vector-gradapprox) # Step 1'
denominator = np.linalg.norm(grads_vector)+np.linalg.norm(gradapprox) # Step 2'
difference = numerator/denominator
if difference > 2e-7:
print ("\033[93m" + "There is a mistake in the backward propagation! difference = " + str(difference) + "\033[0m")
else:
print ("\033[92m" + "Your backward propagation works perfectly fine! difference = " + str(difference) + "\033[0m")
return difference