Что-то не так с моим обратным распространением? - PullRequest
0 голосов
/ 11 февраля 2020

Я строю модель нейронной сети L-слоя. Когда я тренирую модель, после нескольких итераций (около 2-10, зависит от скорости обучения), функция стоимости становится NaN. Первая цена всегда правильная, поэтому я сомневаюсь, что в моей части обратного распространения что-то не так.

def compute_cost(AL, Y):
    m = Y.shape[-1]
    cost = np.sum(- Y*np.log(AL) - (1-Y)*np.log(1-AL))/m
    return cost

def linear_activation_backward(dA, current_cache, activation):
    A_prev,W,Z = current_cache
    if activation == "sigmoid":
        dZ = sigmoid_backward(dA,Z)
    elif activation == "relu":
        dZ = relu_backward(dA,Z)

    dW = np.dot(dZ,A_prev.T)
    db = dZ
    dA_prev = np.dot(W.T,dZ)
    return dW,db,dA_prev

def sigmoid_backward(dA, cache):
    Z = cache
    s = 1/(1+np.exp(-Z))
    dZ = dA * s * (1-s)
    return dZ

def relu_backward(dA, cache):
    Z = cache
    dZ = np.array(dA, copy=True) # just converting dz to a correct object.
    dZ[Z <= 0] = 0
    return dZ

def L_model_backward(AL, Y, caches):
    grads = {}
    L = len(caches)
    dAL = np.divide(AL-Y,AL*(1-AL))
    current_cache = caches[L-1]
    grads["dW"+str(L)],grads["db"+str(L)],grads["dA"+str(L-1)] = linear_activation_backward(dAL,current_cache, activation = "sigmoid")
    for i in reversed(range(1,L)):
        current_cache = caches[i-1]
        grads["dW"+str(i)],grads["db"+str(i)],grads["dA"+str(i-1)] = linear_activation_backward(grads["dA"+str(i)],current_cache, activation = "relu")
    return grads

def L_layer_model(X, Y, layers_dims, learning_rate = 0.0075, num_iterations = 3000, print_cost=False):
    costs = []                 
    parameters = initialize_parameters(layers_dims)
    for i in range(0, num_iterations):
        AL, caches = L_model_forward(X, parameters)
        cost = compute_cost(AL, Y)
        grads = L_model_backward(AL, Y, caches) 
        parameters = update_parameters(parameters, grads, learning_rate)  
    return parameters
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...