【Tensorflow专题-02】使用tensorflow训练神经网络

【Tensorflow专题-02】使用tensorflow实现神经网络


  • 前向传播算法

    如下示意了一个三层的神经网络前向传播过程

    这里写图片描述

    传播过程有三个重要参数,分别是:权重W,节点取值a及输出y,表示为矩阵如下:

    W(1)=W(1)1,1W(1)2,1W(1)3,1W(1)1,2W(1)2,2W(1)3,2W(1)1,3W(1)2,3W(1)3,3

    a(1)=[a11,a12,a13]=xW(1)=[x1,x2]W(1)1,1W(1)2,1W(1)3,1W(1)1,2W(1)2,2W(1)3,2W(1)1,3W(1)2,3W(1)3,3

    [y]=a(1)W(2)=[a11,a12,a13]W(2)1,1W(2)2,1W(2)3,1

    在Tensorflow中表示上述运算过程

    a=tf.matmul(x,w1)
    y=tf.matmul(a,w2)
  • 神经网络参数及Tensorflow变量

    • 变量的生成:使用tf.Variable() 命令,示意如下:
    w=tf.Variable(tf.random_normal([2,3],mean=0,stddev=2))

    关于Tensorflow中的随机数生成,参考下表

    这里写图片描述
    以及常用来初始化变量的函数

    这里写图片描述

    • 参数:偏置项(bias
    biases=tf.Variable(tf.zeros([3]))
    • 一个综合性的前向传播例子
    
    # 一个综合性的介绍前向传播及参数的例子
    
    
    # author = yooongchun
    
    
    # time = 20180102
    
    
    import tensorflow as tf
    
    w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
    w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
    
    x=tf.constant([[0.7,0.9]])
    
    a=tf.matmul(x,w1)
    y=tf.matmul(a,w2)
    
    with tf.Session() as sess:
        tf.global_variables_initializer().run()
        print(sess.run(y))
    
    
    # 运算结果:[[ 3.95757794]]
    
  • 反向传播算法(backpropagation):神经网络优化算法,如下示意图展示了一个完整的反向传播流程
    这里写图片描述

    对于输入,使用placeholder 来表示一个位置,而不是使用常量来表示,这避免了在迭代中生成大量数据占用过多空间的问题

    下面给出一个使用placeholder 来实现前向传播算法的实例:

    
    # TensorFlow 使用Placeholder的前向传播算法例子
    
    
    # author = yooongchun
    
    
    # time = 20180102
    
    
    import tensorflow as tf
    
    w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
    w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
    
    x=tf.placeholder(tf.float32,shape=(1,2),name='input')
    
    a=tf.matmul(x,w1)
    y=tf.matmul(a,w2)
    
    with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(sess.run(y,feed_dict={x:[[0.7,0.9]]}))
    
    
    #结果:[[ 3.95757794]]
    
  • 损失函数:刻画训练值与真实值之间的差距,这里给出一个二分类问题中常用的损失函数:交叉熵(cross entropy)

    cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))#交叉熵
    learning_rate=0.001#学习率
    train_step=tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)#反向传播优化
  • 一个完整的实例:在一个模拟数据集上展示完整的训练过程

    
    # TensorFlow 在模拟训练集上展示完整的训练过程
    
    
    # author = yooongchun
    
    
    # time = 20180102
    
    
    import tensorflow as tf
    from numpy.random import RandomState
    
    
    # 定义训练集大小
    
    batch_size=8
    
    
    # 定义神经网络参数
    
    w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
    w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
    
    
    # 输入的placeholder
    
    
    # None参数表示训练集数据放到了一个batch中
    
    x=tf.placeholder(tf.float32,shape=(None,2),name='input')
    y_=tf.placeholder(tf.float32,shape=(None,1),name='y-input')
    
    
    # 定义神经网络前向传播过程
    
    a=tf.matmul(x,w1)
    y=tf.matmul(a,w2)
    
    
    # 定义损失函数和反向传播算法
    
    cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
    train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
    
    
    # 生成随机数模拟数据集
    
    rdm=RandomState(1)
    dataset_size=128
    X=rdm.rand(dataset_size,2)
    
    
    # 定义标签
    
    
    # 取值为0,1
    
    Y=[[int(x1+x2<1)] for (x1,x2) in X]
    
    
    # 创建会话进行训练
    
    with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print('w1=',sess.run(w1),'\n','w2=',sess.run(w2))
    
    
    # 设定训练轮数
    
    STEPS=50001
    for i in range(STEPS):
        start=(i*batch_size)%dataset_size
        end=min(start+batch_size,dataset_size)
        # 选择样本训练
        sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
        # 每1000步打印一次数据信息
        if i%1000==0:
            total_cross_entropy=sess.run(cross_entropy,feed_dict={x:X,y_:Y})
            print("After %d training step(s),cross entropy on all data is %g"%(i,total_cross_entropy))
    
    
    # 训练完成后的参数
    
    print('w1=',sess.run(w1),'\nw2=',sess.run(w2))

    结果如下:

    w1= [
    [-0.81131822  1.48459876  0.06532937]
    [-2.4427042   0.0992484   0.59122431]] 
    
    w2= [
    [-0.81131822]
    [ 1.48459876]
    [ 0.06532937]]
    
    After 0 training step(s),cross entropy on all data is 0.0674925
    After 1000 training step(s),cross entropy on all data is 0.0163385
    After 2000 training step(s),cross entropy on all data is 0.00907547
    After 3000 training step(s),cross entropy on all data is 0.00714436
    After 4000 training step(s),cross entropy on all data is 0.00578471
    
    w1= [
    [-1.96182752  2.58235407  1.68203771]
    [-3.46817183  1.06982315  2.11788988]] 
    
    w2= [
    [-1.82471502]
    [ 2.68546653]
    [ 1.41819501]]

猜你喜欢

转载自blog.csdn.net/zyc121561/article/details/78950694