zoukankan      html  css  js  c++  java
  • 简单神经网络

    三层简单神经网络

    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]])   # 输入
    

    定义前向传播的神经网络(forward-propagation)

    [a = xw_1; y = aw_2 ]

    a = tf.matmul(x, w1)
    y = tf.matmul(a, w2)
    

    调用会话输出结果

    with tf.Session() as sess:
        sess.run(w1.initializer)  
        sess.run(w2.initializer)  
        print(sess.run(y)) 
    
    [[3.957578]]
    

    使用 placeholder

    placeholder 机制可避免计算图太大,因为,每次使用 tf.constant 便需要创建一个节点。

    # 虽然维度不一定要指定,但是指定后可以降低出错率。
    x = tf.placeholder(tf.float32, shape=(1, 2), name="input")
    a = tf.matmul(x, w1)
    y = tf.matmul(a, w2)
    
    init_op = tf.global_variables_initializer()  # 调用初始化变量
    
    with tf.Session() as sess:
        sess.run(init_op)
        print(sess.run(y, feed_dict={x: [[0.7, 0.9]]}))
    
    [[3.957578]]
    

    增加多个输入

    x = tf.placeholder(tf.float32, shape=(3, 2), name="input")
    a = tf.matmul(x, w1)
    y = tf.matmul(a, w2)
    
    sess = tf.Session()
    #使用tf.global_variables_initializer()来初始化所有的变量
    init_op = tf.global_variables_initializer()  
    sess.run(init_op)
    
    print(sess.run(y, feed_dict={x: [[0.7,0.9],[0.1,0.4],[0.5,0.8]]}))   # 输入3个样例
    
    [[ 3.95757794]
     [ 1.15376544]
     [ 3.16749239]]
    

    import tensorflow as tf
    from numpy.random import RandomState
    

    完整神经网络样例程序

    定义神经网络的参数,输入和输出节点。

    batch_size = 8  # 定义训练数据batch的大小
    
    # 通过`seed`设定随机种子,可以保证每次运行得到的结果是一样的。
    w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
    w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
    
    # 在 `shape`的一个维度上使用`None`可以方便使用不大的batch大小。
    # 在训练时需要把数据分成比较小的batch,但是在测试时,可以一次性的使用全部的数据。当
    # 数据集比较小时方便测试,但数据集比较大时会导致内存溢出。
    x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
    y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
    

    定义前向传播过程,损失函数及反向传播算法(back-propagation)。

    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)))    # 交叉熵,`y_` 代表正确结果,`y` 代表预测值
    train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)      # 反向传播优化方法
    

    生成模拟数据集。

    rdm = RandomState(1)
    X = rdm.rand(128,2)
    #  定义规则来给出样本的标签,在这里所有的 `x1 + x2 < 1` 的样本被认为是正样本,而其他样本为负样本。
    Y = [[int(x1+x2 < 1)] for (x1, x2) in X]
    

    创建一个会话来运行TensorFlow程序。

    with tf.Session() as sess:
        init_op = tf.global_variables_initializer()
        sess.run(init_op)
        
        # 输出目前(未经训练)的参数取值。
        print("w1:", sess.run(w1))
        print("w2:", sess.run(w2))
        print("
    ")
        
        # 训练模型。
        STEPS = 5000      # 设定训练轮数
        for i in range(STEPS):
            # 每次选取batch_size个样本进行训练
            start = (i*batch_size) % 128
            end = (i*batch_size) % 128 + batch_size
    
            # 通过选取的样本训练神经网络并更新参数
            sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
            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("
    ")
        print("w1:", sess.run(w1))
        print("w2:", sess.run(w2))
    
    w1: [[-0.8113182   1.4845988   0.06532937]
     [-2.4427042   0.0992484   0.5912243 ]]
    w2: [[-0.8113182 ]
     [ 1.4845988 ]
     [ 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.9618274  2.582354   1.6820377]
     [-3.4681718  1.0698233  2.11789  ]]
    w2: [[-1.8247149]
     [ 2.6854665]
     [ 1.418195 ]]
  • 相关阅读:
    markown 画图
    C++ 结构体指针
    C++指针详解
    C++ 中类对象与类指针的区别
    Java面向对象㈠ -- 封装
    path和classpath
    "System.Web" 中不存在类型或命名空间
    ASP.NET 后台不识别ASPX中的控件
    asp.net中的<%%>形式的详细用法实例讲解
    ASP.NET前台JS与后台CS函数如何互相调用
  • 原文地址:https://www.cnblogs.com/q735613050/p/7632965.html
Copyright © 2011-2022 走看看