博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python实现单隐层神经网络
阅读量:1860 次
发布时间:2019-04-26

本文共 13854 字,大约阅读时间需要 46 分钟。

功能:实现用神经网络对多样本数据进行分类训练

改进方法:应该把每次训练好的参数写入txt或json中,可以通过选择是否重新训练来调节 预测速度和 准确率的关系

demo.py

import numpy as npimport matplotlib.pyplot as pltfrom planar_utils import plot_decision_boundary, sigmoid, load_planar_datasetdef layer_sizes(X, Y):    """    Arguments:    X -- input dataset of shape (input size, number of examples)    Y -- labels of shape (output size, number of examples)        Returns:    n_x -- the size of the input layer    n_h -- the size of the hidden layer    n_y -- the size of the output layer    """    ### START CODE HERE ### (≈ 3 lines of code)    n_x = X.shape[0] # size of input layer    n_y = Y.shape[0] # size of output layer    ### END CODE HERE ###    return (n_x, n_y)        np.random.seed(1) # set a seed so that the results are consistentdef initialize_parameters(n_x, n_h, n_y):    """    Argument:    n_x -- size of the input layer    n_h -- size of the hidden layer    n_y -- size of the output layer        Returns:    params -- python dictionary containing your parameters:    W1 -- weight matrix of shape (n_h, n_x)    b1 -- bias vector of shape (n_h, 1)    W2 -- weight matrix of shape (n_y, n_h)    b2 -- bias vector of shape (n_y, 1)    """        np.random.seed(2) # we set up a seed so that your output matches ours although the initialization is random.    ### START CODE HERE ### (≈ 4 lines of code)    W1 = np.random.randn(n_h, n_x)*0.01    b1 = np.zeros((n_h, 1))    W2 = np.random.randn(n_y, n_h)*0.01    b2 = np.zeros((n_y, 1))    ### END CODE HERE ###        assert (W1.shape == (n_h, n_x))    assert (b1.shape == (n_h, 1))    assert (W2.shape == (n_y, n_h))    assert (b2.shape == (n_y, 1))        parameters = {"W1": W1,    "b1": b1,    "W2": W2,    "b2": b2}        return parametersdef forward_propagation(X, parameters):    """    Argument:    X -- input data of size (n_x, m)    parameters -- python dictionary containing your parameters (output of initialization function)        Returns:    A2 -- The sigmoid output of the second activation    cache -- a dictionary containing "Z1", "A1", "Z2" and "A2"    """    # Retrieve each parameter from the dictionary "parameters"    ### START CODE HERE ### (≈ 4 lines of code)    W1 = parameters['W1']    b1 = parameters['b1']    W2 = parameters['W2']    b2 = parameters['b2']    ### END CODE HERE ###        # Implement Forward Propagation to calculate A2 (probabilities)    ### START CODE HERE ### (≈ 4 lines of code)    Z1 = np.dot(W1, X) + b1    A1 = np.tanh(Z1)    Z2 = np.dot(W2, A1) + b2    A2 = sigmoid(Z2)    ### END CODE HERE ###        assert(A2.shape == (1, X.shape[1]))        cache = {"Z1": Z1,            "A1": A1,            "Z2": Z2,            "A2": A2}        return A2, cachedef compute_cost(A2, Y, parameters):    """    Computes the cross-entropy cost given in equation (13)        Arguments:    A2 -- The sigmoid output of the second activation, of shape (1, number of examples)    Y -- "true" labels vector of shape (1, number of examples)    parameters -- python dictionary containing your parameters W1, b1, W2 and b2        Returns:    cost -- cross-entropy cost given equation (13)    """        m = float(Y.shape[1]) # number of example        # Compute the cross-entropy cost    ### START CODE HERE ### (≈ 2 lines of code)    logprobs = np.multiply(np.log(A2),Y) + np.multiply((1-Y), (np.log(1-A2)))    cost = -1/m * np.sum(logprobs)    ### END CODE HERE ###        cost = np.squeeze(cost) # makes sure cost is the dimension we expect.     # E.g., turns [[17]] into 17     assert(isinstance(cost, float))        return costdef backward_propagation(parameters, cache, X, Y):    """    Implement the backward propagation using the instructions above.        Arguments:    parameters -- python dictionary containing our parameters     cache -- a dictionary containing "Z1", "A1", "Z2" and "A2".    X -- input data of shape (2, number of examples)    Y -- "true" labels vector of shape (1, number of examples)        Returns:    grads -- python dictionary containing your gradients with respect to different parameters    """    m = float(X.shape[1])        # First, retrieve W1 and W2 from the dictionary "parameters".    ### START CODE HERE ### (≈ 2 lines of code)    W1 = parameters['W1']    W2 = parameters['W2']    ### END CODE HERE ###        # Retrieve also A1 and A2 from dictionary "cache".    ### START CODE HERE ### (≈ 2 lines of code)    A1 = cache['A1']    A2 = cache['A2']    ### END CODE HERE ###        # Backward propagation: calculate dW1, db1, dW2, db2.     ### START CODE HERE ### (≈ 6 lines of code, corresponding to 6 equations on slide above)    dZ2= A2 - Y    dW2 =1/m * np.dot(dZ2, A1.T)    db2 =1/m * np.sum(dZ2, axis=1, keepdims=True)    dZ1 = np.dot(W2.T, dZ2) * (1 - np.power(A1, 2))    dW1 = 1/m * np.dot(dZ1, X.T)    db1 =1/m * np.sum(dZ1, axis=1, keepdims=True)    ### END CODE HERE ###        grads = {"dW1": dW1,            "db1": db1,            "dW2": dW2,            "db2": db2}        return gradsdef update_parameters(parameters, grads, learning_rate = 1.2):    """    Updates parameters using the gradient descent update rule given above        Arguments:    parameters -- python dictionary containing your parameters     grads -- python dictionary containing your gradients         Returns:    parameters -- python dictionary containing your updated parameters     """    # Retrieve each parameter from the dictionary "parameters"    ### START CODE HERE ### (≈ 4 lines of code)    W1 = parameters['W1']    b1 = parameters['b1']    W2 = parameters['W2']    b2 = parameters['b2']    ### END CODE HERE ###        # Retrieve each gradient from the dictionary "grads"    ### START CODE HERE ### (≈ 4 lines of code)    dW1 = grads["dW1"]    db1 = grads["db1"]    dW2 = grads["dW2"]    db2 = grads["db2"]    ## END CODE HERE ###        # Update rule for each parameter    ### START CODE HERE ### (≈ 4 lines of code)    W1 = W1 - learning_rate * dW1    b1 = b1 - learning_rate * db1    W2 = W2 - learning_rate * dW2    b2 = b2 - learning_rate * db2    ### END CODE HERE ###        parameters = {"W1": W1,    "b1": b1,    "W2": W2,    "b2": b2}        return parametersdef nn_model(X, Y, n_h, num_iterations = 10000, print_cost=False):    """    Arguments:    X -- dataset of shape (2, number of examples)    Y -- labels of shape (1, number of examples)    n_h -- size of the hidden layer    num_iterations -- Number of iterations in gradient descent loop    print_cost -- if True, print the cost every 1000 iterations        Returns:    parameters -- parameters learnt by the model. They can then be used to predict.    """        np.random.seed(3)        # Initialize parameters, then retrieve W1, b1, W2, b2. Inputs: "n_x, n_h, n_y". Outputs = "W1, b1, W2, b2, parameters".    ### START CODE HERE ### (≈ 5 lines of code)    n_x, n_y = layer_sizes(X, Y)    parameters = initialize_parameters(n_x, n_h, n_y)    ### END CODE HERE ###        # Loop (gradient descent)        for i in range(0, num_iterations):            ### START CODE HERE ### (≈ 4 lines of code)        # Forward propagation. Inputs: "X, parameters". Outputs: "A2, cache".        A2,cache = forward_propagation(X, parameters)                # Cost function. Inputs: "A2, Y, parameters". Outputs: "cost".        cost = compute_cost(A2, Y, parameters)                # Backpropagation. Inputs: "parameters, cache, X, Y". Outputs: "grads".        grads = backward_propagation(parameters, cache, X, Y)                # Gradient descent parameter update. Inputs: "parameters, grads". Outputs: "parameters".        parameters = update_parameters(parameters, grads)                ### END CODE HERE ###            # Print the cost every 1000 iterations        if print_cost and i % 1000 == 0:            print ("Cost after iteration %i: %f" %(i, cost))        return parametersdef predict(parameters, X):    """    Using the learned parameters, predicts a class for each example in X        Arguments:    parameters -- python dictionary containing your parameters     X -- input data of size (n_x, m)        Returns    predictions -- vector of predictions of our model (red: 0 / blue: 1)    """        # Computes probabilities using forward propagation, and classifies to 0/1 using 0.5 as the threshold.    ### START CODE HERE ### (≈ 2 lines of code)    A2, cache = forward_propagation(X, parameters)    predictions = np.array( [1 if x >0.5 else 0 for x in A2.reshape(-1,1)] ).reshape(A2.shape) # 这一行代码的作用详见下面代码示例    ### END CODE HERE ###        return predictionsX, Y = load_planar_dataset()# print(X.shape) #(2, 400) 在load中进行了转置,其中2代表单个样本特征数,400 代表样本数# print(Y.shape) #(1, 400) 在load中进行了转置,本例中1代表输出层个数,400 代表样本数plt.scatter(X[0, :], X[1, :], c=Y, s=40); #c代表色彩或颜色序列 s代表标量或形如shape[n,]数组# Build a model with a n_h-dimensional hidden layerparameters = nn_model(X, Y, n_h = 4, num_iterations = 10000, print_cost=True) # Plot the decision boundaryplot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)pre = predict(parameters, X)print ('training accuracy: %.2f' % (np.mean(pre == Y[0])))plt.title("Decision Boundary for hidden layer size " + str(4))plt.show()

planar_utils.py

'''Created on 2018年7月18日@author: hcl'''import matplotlib.pyplot as pltimport numpy as npdef plot_decision_boundary(model, X, y):    # Set min and max values and give it some padding    x_min, x_max = X[0, :].min() - 1, X[0, :].max() + 1    y_min, y_max = X[1, :].min() - 1, X[1, :].max() + 1    h = 0.01    # Generate a grid of points with distance h between them        xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))    # Predict the function value for the whole grid    Z = model(np.c_[xx.ravel(), yy.ravel()])    Z = Z.reshape(xx.shape)        # Plot the contour and training examples    plt.contourf(xx, yy, Z)     plt.ylabel('x2')    plt.xlabel('x1')    plt.scatter(X[0, :], X[1, :], c=y)    def sigmoid(x):    """    Compute the sigmoid of x    Arguments:    x -- A scalar or numpy array of any size.    Return:    s -- sigmoid(x)    """    s = 1/(1+np.exp(-x))    return sdef load_planar_dataset():    np.random.seed(1)    m = 400 # number of examples    N = int(m/2) # number of points per class    D = 2 # dimensionality    X = np.zeros((m,D)) # data matrix where each row is a single example    Y = np.zeros((m,1), dtype='uint8') # labels vector (0 for red, 1 for blue)    a = 4 # maximum ray of the flower    for j in range(2):        ix = range(N*j,N*(j+1))        t = np.linspace(j*3.12,(j+1)*3.12,N) + np.random.randn(N)*0.2 # theta        r = a*np.sin(4*t) + np.random.randn(N)*0.2 # radius        X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]        Y[ix] = j            X = X.T    Y = Y.T    return X, Y

输出:

Cost after iteration 0: 0.693048Cost after iteration 1000: 0.288083Cost after iteration 2000: 0.254385Cost after iteration 3000: 0.233864Cost after iteration 4000: 0.226792Cost after iteration 5000: 0.222644Cost after iteration 6000: 0.219731Cost after iteration 7000: 0.217504Cost after iteration 8000: 0.219504Cost after iteration 9000: 0.218571training accuracy: 0.91

 

1:通过修改对应的X Y数据集 可以训练不同的数据

X = np.array([  [0,0,1],                [1,1,1],                [1,0,1],                [0,1,1] ]).TY = np.array([[0,1,1,0]])

输出;

Cost after iteration 0: 0.693173Cost after iteration 1000: 0.000294Cost after iteration 2000: 0.000138Cost after iteration 3000: 0.000090Cost after iteration 4000: 0.000066Cost after iteration 5000: 0.000052Cost after iteration 6000: 0.000043Cost after iteration 7000: 0.000037Cost after iteration 8000: 0.000032Cost after iteration 9000: 0.000028

2:在planar_utils.py中添加 

并在开头导入:import sklearn.datasets

def load_extra_datasets():      N = 200    noisy_circles = sklearn.datasets.make_circles(n_samples=N, factor=.5, noise=.3)    noisy_moons = sklearn.datasets.make_moons(n_samples=N, noise=.2)    blobs = sklearn.datasets.make_blobs(n_samples=N, random_state=5, n_features=2, centers=6)    gaussian_quantiles = sklearn.datasets.make_gaussian_quantiles(mean=None, cov=0.5, n_samples=N, n_features=2, n_classes=2, shuffle=True, random_state=None)    no_structure = np.random.rand(N, 2), np.random.rand(N, 2)        return noisy_circles, noisy_moons, blobs, gaussian_quantiles, no_structure

在demo.py中 导入load_extra_datasets

并将X Y数据来源 改为:

noisy_circles, noisy_moons, blobs, gaussian_quantiles, no_structure = load_extra_datasets()datasets = {'noisy_circles':noisy_circles,            'noisy_moons':noisy_moons,            'blobs':blobs,            'gaussian_quantiles':gaussian_quantiles,            }dataset = 'noisy_moons'X,Y = datasets[dataset]X,Y = X.T, Y.reshape(1,Y.shape[0])if dataset == 'blobs':    Y = Y % 2    plt.scatter(X[0, :], X[1, :], c=Y, s=40)

训练输出:

Cost after iteration 0: 0.692994Cost after iteration 1000: 0.299064Cost after iteration 2000: 0.131752Cost after iteration 3000: 0.124443Cost after iteration 4000: 0.121406Cost after iteration 5000: 0.118751Cost after iteration 6000: 0.116311Cost after iteration 7000: 0.114297Cost after iteration 8000: 0.112747Cost after iteration 9000: 0.111537training accuracy: 0.95

3、查看不同隐藏层节点数对预测数据精确度的影响

 在获取X Y数据集以后:

plt.figure(figsize=(16, 32))hidden_layer_sizes = [1, 2, 3, 4, 5, 20, 50]for i, n_h in enumerate(hidden_layer_sizes):    plt.subplot(5, 2, i+1)        plt.title('Hidden Layer of size %d' % n_h)        parameters = nn_model(X, Y, n_h, num_iterations = 5000)        plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)        predictions = predict(parameters, X)        accuracy = float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100)        print ("Accuracy for {} hidden units: {} %".format(n_h, accuracy))plt.show()

输出:

Accuracy for 1 hidden units: 67.5 %Accuracy for 2 hidden units: 67.25 %Accuracy for 3 hidden units: 90.75 %Accuracy for 4 hidden units: 90.5 %Accuracy for 5 hidden units: 91.25 %Accuracy for 20 hidden units: 90.0 %Accuracy for 50 hidden units: 90.75 %

 

你可能感兴趣的文章
Docker:基础知识
查看>>
linux安装VMtools
查看>>
移动硬盘插入win10检测到却不显示盘符解决方法
查看>>
怎么查看本机S/N序列号和BIOS版本
查看>>
ThinkPad X1 Carbon安装win7.
查看>>
EasyOrtho卫星影像处理软件
查看>>
TerraMaster RAID Manager
查看>>
vmware vcenter converter(物理机转换虚拟机)
查看>>
解决Surface 网卡不识别
查看>>
回收站东西太多删不掉
查看>>
超融合与云计算的区别是什么?
查看>>
SuperSocket
查看>>
修改ant design的tooltip组件中的字体颜色(2分钟解决战斗)
查看>>
参观邓小平故居有感
查看>>
教你如何查看linux版本
查看>>
Linux下利用crontab执行任务
查看>>
RedHat Linux下注册Apache为系统服务
查看>>
使用LoadRunner监控Apache的步骤
查看>>
LoadRunner录制脚本时报加载GrooveUtil.dll出错的解决方法
查看>>
用Spotlight实时监控Windows Server 2008
查看>>