Проблема с проверкой градиента в глубокой нейронной сети - PullRequest
0 голосов
/ 20 февраля 2019

Я сейчас пишу код для глубокой нейронной сети.Я реализовал вперед 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
...