黑马程序员技术交流社区

标题: 【上海校区】吴恩达机器学习 笔记四 BP神经网络 [打印本页]

作者: 不二晨    时间: 2018-9-9 10:43
标题: 【上海校区】吴恩达机器学习 笔记四 BP神经网络
1. 神经网络比较重点的几个地方1.1 变换坐标

  其实确切的原因是因为各层之间权值组成的矩阵对坐标系进行了改变,比如,旋转,拉伸,降维。具体可以参考我的另外一篇关于矩阵的文章,传送门在此

1.2 激活函数

  软饱和的激活函数可以将直线掰弯。矩阵操作线性的,但是经过激活函数之后就可以非线性。

1.3 反向传播的是误差

  每个权重的梯度都等于与其相连的前一层节点的输出乘以与其相连的后一层的反向传播的输出(包含误差)

2. tensorflow实现BP神经网络的拟合'''Author       :  vivalazxpDate         :  9/2/2018Description  :  neural network non_linear regression'''import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt'''Description    : create data for neural network non-linear regressionParam          : numData         number of training data                 sigma           power of noise                 horizon_limit   horizontal limitReturn         : horizon_data    horizontal axis  shape=(1,numData)                 vertical_data   vertical axis    shape=(1,numData) '''def create_data_nn_non_lin_reg(numData,sigma, horizon_limit):    horizon_data = horizon_limit * 2*(np.random.rand(numData)-0.5)[np.newaxis, :]    vertical_data = np.sin(horizon_data)    # add noise    vertical_data = vertical_data + sigma*np.random.rand(numData)    print('-------------- create data sucessfully --------------')    return horizon_data, vertical_data'''Description  : add one neural network layerParam        : @input_data     input data               @input_size     number of neurons in the input layer                @output_size    number of nuerons in the output layerReturn       : @Weight    weight of the layer added               @Bias      bias of the layer added               @output_data    output of the layer added'''def add_layer(input_data, input_size, output_size, activation_function):    Weight = tf.Variable(tf.random_normal([output_size, input_size]))    Bias = tf.Variable(tf.random_normal([output_size, 1]))    WX_plus_B = tf.matmul(Weight, input_data) + Bias    if activation_function == None:        ouput_data = WX_plus_B    else:        ouput_data = activation_function(WX_plus_B)    print('------------- add one nn layer sucessfully --------------')    return Weight, Bias, ouput_data'''Description     :  use tensorflow to complete neural network with nonlinear regressionParam           :  @hid_layer_size   number of neurons in the hidden layer                   @out_layer_size   number of neurons in the output layer                   @alpha    learning rate                   @steps    sum learning stepsReturn          :  @Weight_hid    weight of the hidden layer                   @Weight_out    weight of the output layer                   @Bias_hid      bias of the hidded layer                   @Bias_out      bias of the output layer                   @loss          cost variation in the training'''def tf_nn_clas(horizon_data, vertical_data, in_layer_size, hid_layer_size, out_layer_size, alpha, stpes):    horizon_from_data = tf.placeholder(tf.float32)    vertical_from_data = tf.placeholder(tf.float32)    # hidder layer, sigmoid activate function    Weight_hid, Bias_hid, out_hid = add_layer(horizon_from_data, in_layer_size, hid_layer_size, activation_function=tf.nn.sigmoid)    # output layer, no activate function    Weight_out, Bias_out, class_pred = add_layer(out_hid, hid_layer_size, out_layer_size, activation_function=None)    # cost and optimizer    cost = tf.reduce_mean(tf.square(vertical_from_data - class_pred))    optimizer = tf.train.GradientDescentOptimizer(alpha).minimize(cost)    # session    sess = tf.Session()    init = tf.global_variables_initializer()    sess.run(init)    print('----------train started------------')    loss = np.zeros(steps)    for step in range(steps):        sess.run(optimizer, feed_dict={horizon_from_data:horizon_data, vertical_from_data:vertical_data})        loss[step] = sess.run(cost, feed_dict={horizon_from_data:horizon_data, vertical_from_data:vertical_data})    print('-----------train completed---------------')    Weight_hid = sess.run(Weight_hid)    Weight_out = sess.run(Weight_out)    Bias_hid = sess.run(Bias_hid)    Bias_out = sess.run(Bias_out)    return Weight_hid ,Weight_out, Bias_hid, Bias_out, lossdef sigmoid(x):    return 1 / (1 + np.exp(-x))if __name__ == "__main__":    numData = 1000    sigma = 1    horizon_limit = 3    alpha = 0.2    steps = 2000    dynam = 5    in_layer_size = 1    out_layer_size = 1    hid_layer_size = np.ceil(np.sqrt(in_layer_size+out_layer_size)).astype(np.int32) + dynam    horizon_data, vertical_data = create_data_nn_non_lin_reg(numData, sigma, horizon_limit)    Weight_hid, Weight_out, Bias_hid, Bias_out, loss = tf_nn_clas(horizon_data,vertical_data,in_layer_size, hid_layer_size,out_layer_size,alpha,steps)    # regression curve    plt.figure(1)    num_fitting = 200    horizon_fit = np.linspace(-horizon_limit, horizon_limit, num_fitting)[np.newaxis,:]    vertical_fit = np.zeros(num_fitting)    output_hid = sigmoid(Weight_hid*horizon_fit + np.tile(Bias_hid,(1,num_fitting)))    vertical_fit = np.matmul(Weight_out, output_hid) + np.tile(Bias_out,(1,num_fitting))    plt.scatter(horizon_data, vertical_data, marker='o', label='training data')    plt.plot(horizon_fit[0,:], vertical_fit[0,:], 'r', label='regression line')    plt.legend()    plt.xlabel('horizontal axis')    plt.ylabel('vertical axis')    plt.title('nn non linear regression')    # cost variation    plt.figure(2)    plt.plot(range(steps), loss)    plt.xlabel('step')    plt.ylabel('loss')    plt.title('loss variation in nn non linear regression')    plt.show()

3. tensorflow实现BP神经网络的二分类'''Author       :  vivalazxpDate         :  9/2/2018Description  :  neural network non_linear regression'''import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt'''Description    : create data for neural network classificationParam          : numData         number of training data                 vertical_limit           power of noise                 horizon_limit   horizontal limitReturn         : axis_data       horizontal and vertical axis  shape=(2,numData)                 class_data      vertical axis    shape=(numData,) '''def create_data_nn_clas(numData, vertical_limit, horizon_limit):    axis_data = np.zeros([2,numData])    axis_data[0,:] = horizon_limit * 2*(np.random.rand(numData)-0.5)    axis_data[1,:] = vertical_limit * 2*(np.random.rand(numData) - 0.5)    class_data = np.zeros(numData)    for index in range(numData):        if np.sin(axis_data[0,index]) - axis_data[1,index] > 0:            class_data[index] = 1            plt.scatter(axis_data[0,index],axis_data[1,index],c='g')        else:            class_data[index] = 0            plt.scatter(axis_data[0, index], axis_data[1, index], c='b')    print('-------------- create data sucessfully --------------')    return axis_data, class_data'''Description  : add one neural network layerParam        : @input_data     input_data data               @input_size     size of input_data                @output_size    size of output'''def add_layer(input_data, input_size, output_size, activation_function):    Weight = tf.Variable(tf.random_normal([output_size, input_size]))    Bias = tf.Variable(tf.random_normal([output_size, 1]))    WX_plus_B = tf.matmul(Weight, input_data) + Bias    if activation_function == None:        ouput_data = WX_plus_B    else:        ouput_data = activation_function(WX_plus_B)    print('------------- add one nn layer sucessfully --------------')    return Weight, Bias, ouput_data'''Description     :  use tensorflow to complete neural network classificationParam           :  @hid_layer_size   number of neurons in the hidden layer                   @out_layer_size   number of neurons in the output layer                   @alpha    learning rate                   @steps    sum learning stepsReturn          :  @Weight_hid    weight of the hidden layer                   @Weight_out    weight of the output layer                   @Bias_hid      bias of the hidded layer                   @Bias_out      bias of the output layer                   @loss          cost variation in the training'''def tf_nn_clas(axis_data, class_data, in_layer_size, hid_layer_size, out_layer_size, alpha, stpes):    axis_from_data = tf.placeholder(tf.float32)    class_from_data = tf.placeholder(tf.float32)    # hidder layer, sigmoid activate function    Weight_hid, Bias_hid, out_hid = add_layer(axis_from_data, in_layer_size, hid_layer_size, activation_function=tf.nn.sigmoid)    # output layer, no activate function    Weight_out, Bias_out, class_pred = add_layer(out_hid, hid_layer_size, out_layer_size, activation_function=tf.nn.sigmoid)    # cost and optimizer    cost = tf.reduce_mean(- class_from_data * tf.log(class_pred) \                          - (1 - class_from_data) * tf.log(1 - class_pred))    optimizer = tf.train.GradientDescentOptimizer(alpha).minimize(cost)    # session    sess = tf.Session()    init = tf.global_variables_initializer()    sess.run(init)    print('----------train started------------')    loss = np.zeros(steps)    for step in range(steps):        sess.run(optimizer, feed_dict={axis_from_data:axis_data, class_from_data:class_data})        loss[step] = sess.run(cost, feed_dict={axis_from_data:axis_data, class_from_data:class_data})        if step % 500 == 0:            print(step)    print('-----------train completed---------------')    Weight_hid = sess.run(Weight_hid)    Weight_out = sess.run(Weight_out)    Bias_hid = sess.run(Bias_hid)    Bias_out = sess.run(Bias_out)    return Weight_hid ,Weight_out, Bias_hid, Bias_out, lossdef sigmoid(x):    return 1 / (1 + np.exp(-x))if __name__ == "__main__":    numData = 1000    vertical_limit = 2    horizon_limit = 3    alpha = 1    steps = 2000    neur_dynam = 5    in_layer_size = 2    out_layer_size = 1    hid_layer_size = np.ceil(np.sqrt(in_layer_size+out_layer_size)).astype(np.int32) + neur_dynam    axis_data, class_data = create_data_nn_clas(numData, vertical_limit, horizon_limit)    Weight_hid, Weight_out, Bias_hid, Bias_out, loss = tf_nn_clas(axis_data,class_data,in_layer_size, hid_layer_size,out_layer_size,alpha,steps)    # classification curve    num_clas = 200    horizon_clas = np.linspace(-horizon_limit, horizon_limit, num_clas)    vertical_tmp = np.linspace(-vertical_limit, vertical_limit, num_clas)    vertical_clas = np.zeros(num_clas)    for index_horiz in range(num_clas):        for index_verti in range(num_clas):            input = np.array([horizon_clas[index_horiz],vertical_tmp[index_verti]])[:,np.newaxis]            ouput_hid = sigmoid(np.matmul(Weight_hid, input) + Bias_hid)            output = np.matmul(Weight_out,ouput_hid) + Bias_out            if output > -0.2 and output < 0.2:                vertical_clas[index_horiz] = vertical_tmp[index_verti]                continue    plt.plot(horizon_clas, vertical_clas, 'r', label='classification line')    plt.legend()    plt.xlabel('horizontal axis')    plt.ylabel('vertical axis')    plt.title('nn classification')    # cost variation    plt.figure()    plt.plot(range(steps), loss)    plt.xlabel('step')    plt.ylabel('loss')    plt.title('loss variation in nn classification')    plt.show()



作者: 不二晨    时间: 2018-9-13 16:27

很不错,受教了
作者: 不二晨    时间: 2018-9-20 17:28
奈斯
作者: loir1216    时间: 2018-9-20 21:18

作者: 魔都黑马少年梦    时间: 2018-11-1 16:48





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2