DNNを構築して予測する(続き:自作コードで深さニューラルネットワークを実現する)

12633 ワード

自分で作ったDNNを利用して簡単な予測をする.前編の博文です:《自己コードは深さの神経のネットワークを実現します》の後続の部分を実現します.前編を呼び出す関数は次のとおりです.
def initialize_parameters_deep(layer_dims):
    ...
    return parameters 
def L_model_forward(X, parameters):
    ...
    return AL, caches
def compute_cost(AL, Y):
    ...
    return cost
def L_model_backward(AL, Y, caches):
    ...
    return grads
def update_parameters(parameters, grads, learning_rate):
    ...
    return parameters

予測関数を定義し、予測結果Pを出力する
def predict(X, y, parameters):
    
    m = X.shape[1]
    n = len(parameters) // 2 # number of layers in the neural network
    p = np.zeros((1,m))
    
    # Forward propagation
    probas, caches = L_model_forward(X, parameters)

    # convert probas to 0/1 predictions
    for i in range(0, probas.shape[1]):
        if probas[0,i] > 0.5:
            p[0,i] = 1
        else:
            p[0,i] = 0
   
    print("Accuracy: "  + str(np.sum(p == y)/m))    
    return p

勾配降下による反復パラメータparametersの使用
def L_layer_model(X, Y, layers_dims, learning_rate = 0.0075, num_iterations = 3000, print_cost=False):

    np.random.seed(1)
    costs = []                         # keep track of cost
    
    # Parameters initialization.
    parameters = initialize_parameters_deep(layers_dims)
    
    # Loop (gradient descent)
    for i in range(0, num_iterations):

        #  
        AL, caches =L_model_forward(X, parameters)   
             
        # cost 
        cost = compute_cost(AL, Y)
    
        #  
        grads = L_model_backward(AL, Y, caches)
 
        #  
        parameters = update_parameters(parameters, grads, learning_rate)
                        
        #  cost
        if print_cost and i % 100 == 0:
            print ("Cost after iteration %i: %f" %(i, cost))
        if print_cost and i % 100 == 0:
            costs.append(cost)
            
    #  cost 
    plt.plot(np.squeeze(costs))
    plt.ylabel('cost')
    plt.xlabel('iterations (per tens)')
    plt.title("Learning rate =" + str(learning_rate))
    plt.show()
    
    return parameters
parameters = L_layer_model(train_x, train_y, layers_dims, num_iterations = 2500,  print_cost=True)
pred_train = predict(train_x, train_y, parameters)

Accuracy: 0.9856459330143541
pred_test = predict(test_x, test_y, parameters)

Accuracy: 0.8
精度は,浅層ニューラルネットワークを用いると最高でも0.72しかなく,hidden unitが多く,過フィッティングを招くことも許容できる.