TensorFlow 基础(F)

作者: zidea | 来源:发表于2019-10-19 21:12 被阅读0次
    awesome-tensorflow

    今天我们来通过解决一个二分类问题实现一个比较完整的神经网络,虽然简单但是在完成这个实例我们就可以大概走了一个开发流程。

    • 准备数据集
    • 构建计算图
    • 定义损失函数
    • 测量准确度

    引入依赖

    #coding=utf-8
    import tensorflow as tf
    from numpy.random import RandomState
    

    准备数据集

    random_state = RandomState(1)
    dataset_size = 128
    X = random_state.rand(dataset_size,2)
    print(X[:5])
    
    [[4.17022005e-01 7.20324493e-01]
     [1.14374817e-04 3.02332573e-01]
     [1.46755891e-01 9.23385948e-02]
     [1.86260211e-01 3.45560727e-01]
     [3.96767474e-01 5.38816734e-01]]
    

    这里我们用 X 表示样板,通过用大写字母表示矩阵以便于与向量进行区分。

    [[0], [1], [1], [1], [1]]
    

    定义变量

    learning_rate = 0.001
    STEPS = 5000
    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))
    
    

    这里定义w_1 输入为 2 为向量输入到一个有 3 个节点的隐藏层所有 w_1 为一个 2 x 3 矩阵,然后因为输出一维矩阵。所以定义 w_2 为 3 x 1 矩阵。

    x = tf.placeholder(tf.float32, shape=(None,2),name='x')
    y_ = tf.placeholder(tf.float32, shape=(None,1), name='y')
    

    tf.random_normal() 函数用于生成服从指定正太分布的数值中取出指定个数的值作为数值。
    tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

    参数说明
    • shape: 一维的张量,也是输出的张量。
    • mean: 正态分布的均值。
    • stddev: 正态分布的标准差。
    • dtype: 输出的类型。
    • seed: 一个整数,当设置之后,每次生成的随机数都一样。
    • name: 操作的名字

    构建计算图

    正向传播
    x = tf.placeholder(tf.float32, shape=(None,2),name='x')
    y_ = tf.placeholder(tf.float32, shape=(None,1), name='y')
    layer_one = tf.matmul(x,w1)
    y = tf.matmul(layer_one,w2)
    
    
    反向传播

    定义损失函数和优化过程,我们这损失函数使用的交叉熵来计算损失值。优化器这里使用 AdamOptimizer ,并且学习率给 0.001

    cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)))
    train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)
    
    创建会话
    init_op = tf.initialize_all_variables()
    # 创建会话
    with tf.Session() as sess:
        sess.run(init_op)
        print sess.run(w1)
        print sess.run(w2)
    
    [[-0.8113182   1.4845988   0.06532937]
     [-2.4427042   0.0992484   0.5912243 ]]
    [[-0.8113182 ]
     [ 1.4845988 ]
     [ 0.06532937]]
    

    我们定义一个 load_data 函数来负责加载按批次来加载数据。

    def load_data(index):
        start = (i * batch_size) % dataset_size
        end = min(start+batch_size,dataset_size)
        return X[start:end],Y[start:end]
    
    with tf.Session() as sess:
        sess.run(init_op)
        # print sess.run(w1)
        # print sess.run(w2)
        for i in range(STEPS):
           
            x_data,y_data = load_data(i)
            sess.run(train_step,feed_dict={x:x_data,y_:y_data})
    
            if i % 1000 == 0:
                total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
                print "After %d training steps ,cross_entropy on all data is %g" % (i, total_cross_entropy)
        
    
    After 0 training steps ,cross_entropy on all data is 0.0674925
    After 1000 training steps ,cross_entropy on all data is 0.0163385
    After 2000 training steps ,cross_entropy on all data is 0.00907547
    After 3000 training steps ,cross_entropy on all data is 0.00714436
    After 4000 training steps ,cross_entropy on all data is 0.00578471
    

    通过损失函数值逐渐在减少,说明训练结果是有效的。

    相关文章

      网友评论

        本文标题:TensorFlow 基础(F)

        本文链接:https://www.haomeiwen.com/subject/hfpnmctx.html