Я строю модель нейронной сети 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