zoukankan      html  css  js  c++  java
  • TensorFlow学习笔记

    TensorFlow学习笔记


    基础构架

    搭建模型

    Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
    biases = tf.Variable(tf.zeros([1]))
    
    y = Weights*x_data + biases
    

    计算误差

    接着就是计算 yy_data 的误差:

    loss = tf.reduce_mean(tf.square(y-y_data))
    

    传播误差

    反向传递误差的工作就教给optimizer了, 我们使用的误差传递方法是梯度下降法: Gradient Descent 让后我们使用 optimizer 来进行参数的更新.

    optimizer = tf.train.GradientDescentOptimizer(0.5)
    train = optimizer.minimize(loss)
    

    训练

    到目前为止, 我们只是建立了神经网络的结构, 还没有使用这个结构. 在使用这个结构之前, 我们必须先初始化所有之前定义的Variable, 所以这一步是很重要的!

    # init = tf.initialize_all_variables() # tf 马上就要废弃这种写法
    init = tf.global_variables_initializer()  # 替换成这样就好
    

    接着,我们再创建会话 Session. 我们会在下一节中详细讲解 Session. 我们用 Session 来执行 init 初始化步骤. 并且, 用 Sessionrun 每一次 training 的数据. 逐步提升神经网络的预测准确性.

    sess = tf.Session()
    sess.run(init)          # Very important
    
    for step in range(201):
        sess.run(train)
        if step % 20 == 0:
            print(step, sess.run(Weights), sess.run(biases))
    

    Session 会话控制

    Session 是 Tensorflow 为了控制,和输出文件的执行的语句. 运行 session.run() 可以获得你要得知的运算结果, 或者是你所要运算的部分.

    首先,加载 Tensorflow ,然后建立两个 matrix ,输出两个 matrix 矩阵相乘的结果。

    import tensorflow as tf
    
    # create two matrixes
    
    matrix1 = tf.constant([[3,3]])
    matrix2 = tf.constant([[2],
                           [2]])
    product = tf.matmul(matrix1,matrix2)
    

    因为 product 不是直接计算的步骤, 所以我们会要使用 Session 来激活 product 并得到计算结果. 有两种形式使用会话控制 Session

    # method 1
    sess = tf.Session()
    result = sess.run(product)
    print(result)
    sess.close()
    # [[12]]
    
    # method 2
    with tf.Session() as sess:
        result2 = sess.run(product)
        print(result2)
    # [[12]]
    

    Variable 变量

    在 Tensorflow 中,定义了某字符串是变量,它才是变量,这一点是与 Python 所不同的。

    定义语法: state = tf.Variable()

    import tensorflow as tf
    
    state = tf.Variable(0, name='counter')
    
    # 定义常量 one
    one = tf.constant(1)
    
    # 定义加法步骤 (注: 此步并没有直接计算)
    new_value = tf.add(state, one)
    
    # 将 State 更新成 new_value
    update = tf.assign(state, new_value)
    

    如果你在 Tensorflow 中设定了变量,那么初始化变量是最重要的!!所以定义了变量以后, 一定要定义 init = tf.initialize_all_variables() .

    到这里变量还是没有被激活,需要再在 sess 里, sess.run(init) , 激活 init 这一步.

    # 如果定义 Variable, 就一定要 initialize
    # init = tf.initialize_all_variables() # tf 马上就要废弃这种写法
    init = tf.global_variables_initializer()  # 替换成这样就好
     
    # 使用 Session
    with tf.Session() as sess:
        sess.run(init)
        for _ in range(3):
            sess.run(update)
            print(sess.run(state))
    
    

    注意:直接 print(state) 不起作用!!

    一定要把 sess 的指针指向 state 再进行 print 才能得到想要的结果!

    Placeholder 传入值

    placeholder 是 Tensorflow 中的占位符,暂时储存变量.

    Tensorflow 如果想要从外部传入data, 那就需要用到 tf.placeholder(), 然后以这种形式传输数据 sess.run(***, feed_dict={input: **}).

    示例:

    import tensorflow as tf
    
    #在 Tensorflow 中需要定义 placeholder 的 type ,一般为 float32 形式
    input1 = tf.placeholder(tf.float32)
    input2 = tf.placeholder(tf.float32)
    
    # mul = multiply 是将input1和input2 做乘法运算,并输出为 output 
    ouput = tf.multiply(input1, input2)
    
    

    接下来, 传值的工作交给了 sess.run() , 需要传入的值放在了feed_dict={} 并一一对应每一个 input. placeholderfeed_dict={} 是绑定在一起出现的。

    with tf.Session() as sess:
        print(sess.run(ouput, feed_dict={input1: [7.], input2: [2.]}))
    # [ 14.]
    
    

    建造神经网络

    添加层 def add_layer()

    在 Tensorflow 里定义一个添加层的函数可以很容易的添加神经层,为之后的添加省下不少时间.

    神经层里常见的参数通常有weightsbiases和激励函数。

    首先,我们需要导入tensorflow模块。

    import tensorflow as tf
    

    然后定义添加神经层的函数def add_layer(),它有四个参数:输入值、输入的大小、输出的大小和激励函数,我们设定默认的激励函数是None

    def add_layer(inputs, in_size, out_size, activation_function=None):    
    
    

    接下来,我们开始定义weightsbiases

    因为在生成初始参数时,随机变量(normal distribution)会比全部为0要好很多,所以我们这里的weights为一个in_size行, out_size列的随机变量矩阵。

    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    
    

    在机器学习中,biases的推荐值不为0,所以我们这里是在0向量的基础上又加了0.1

    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    
    

    下面,我们定义Wx_plus_b, 即神经网络未激活的值。其中,tf.matmul()是矩阵的乘法。

    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    

    activation_function——激励函数为None时,输出就是当前的预测值——Wx_plus_b,不为None时,就把Wx_plus_b传到activation_function()函数中得到输出。

    if activation_function is None:
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b)
    

    最后,返回输出,添加一个神经层的函数——def add_layer()就定义好了。

    return outputs
    

    建造神经网络

    首先,我们导入本次所需的模块。

    import tensorflow as tf
    import numpy as np
    
    

    构造添加一个神经层的函数。(在上次课程中有详细介绍)

    def add_layer(inputs, in_size, out_size, activation_function=None):
        Weights = tf.Variable(tf.random_normal([in_size, out_size]))
        biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
        Wx_plus_b = tf.matmul(inputs, Weights) + biases
        if activation_function is None:
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b)
        return outputs
    
    

    导入数据

    构建所需的数据。 这里的x_datay_data并不是严格的一元二次函数的关系,因为我们多加了一个noise,这样看起来会更像真实情况。

    x_data = np.linspace(-1,1,300, dtype=np.float32)[:, np.newaxis]
    noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32)
    y_data = np.square(x_data) - 0.5 + noise
    

    利用占位符定义我们所需的神经网络的输入。 tf.placeholder()就是代表占位符,这里的None代表无论输入有多少都可以,因为输入只有一个特征,所以这里是1

    xs = tf.placeholder(tf.float32, [None, 1])
    ys = tf.placeholder(tf.float32, [None, 1])
    

    接下来,我们就可以开始定义神经层了。 通常神经层都包括输入层、隐藏层和输出层。这里的输入层只有一个属性, 所以我们就只有一个输入;隐藏层我们可以自己假设,这里我们假设隐藏层有10个神经元; 输出层和输入层的结构是一样的,所以我们的输出层也是只有一层。 所以,我们构建的是——输入层1个、隐藏层10个、输出层1个的神经网络。

    搭建网络

    下面,我们开始定义隐藏层,利用之前的add_layer()函数,这里使用 Tensorflow 自带的激励函数tf.nn.relu

    l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
    
    

    接着,定义输出层。此时的输入就是隐藏层的输出——l1,输入有10层(隐藏层的输出层),输出有1层。

    prediction = add_layer(l1, 10, 1, activation_function=None)
    
    

    计算预测值prediction和真实值的误差,对二者差的平方求和再取平均。

    loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
                         reduction_indices=[1]))
    
    

    接下来,是很关键的一步,如何让机器学习提升它的准确率。tf.train.GradientDescentOptimizer()中的值通常都小于1,这里取的是0.1,代表以0.1的效率来最小化误差loss

    train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
    
    

    使用变量时,都要对它进行初始化,这是必不可少的。

    # init = tf.initialize_all_variables() # tf 马上就要废弃这种写法
    init = tf.global_variables_initializer()  # 替换成这样就好
    
    

    定义Session,并用 Session 来执行 init 初始化步骤。 (注意:在tensorflow中,只有session.run()才会执行我们定义的运算。)

    sess = tf.Session()
    sess.run(init)
    
    

    训练

    下面,让机器开始学习。

    比如这里,我们让机器学习1000次。机器学习的内容是train_step, 用 Sessionrun 每一次 training 的数据,逐步提升神经网络的预测准确性。 (注意:当运算要用到placeholder时,就需要feed_dict这个字典来指定输入。)

    for i in range(1000):
        # training
        sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
    
    

    每50步我们输出一下机器学习的误差。

        if i % 50 == 0:
            # to see the step improvement
            print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
    
    

    结果可视化

    matplotlib 可视化

    构建图形,用散点图描述真实数据之间的关系。 (注意:plt.ion()用于连续显示。)

    # plot the real data
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    ax.scatter(x_data, y_data)
    plt.ion()#本次运行请注释,全局运行不要注释
    plt.show()
    
    

    接下来,我们来显示预测数据。

    每隔50次训练刷新一次图形,用红色、宽度为5的线来显示我们的预测数据和输入之间的关系,并暂停0.1s。

    for i in range(1000):
        # training
        sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
        if i % 50 == 0:
            # to visualize the result and improvement
            try:
                ax.lines.remove(lines[0])
            except Exception:
                pass
            prediction_value = sess.run(prediction, feed_dict={xs: x_data})
            # plot the prediction
            lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
            plt.pause(0.1)
    
    
  • 相关阅读:
    STL逆序迭代器(reverse_iterator)
    STL容器之vector容器API(二)
    STL容器之vector容器巧用swap收缩空间
    STL容器之vector容器API(一)
    STL容器vector概念和注意事项(每次扩充都会重新开辟空间,释放原空间,即首元素地址会变一次)
    STL容器之string内存重定义
    STL容器之string与c_style类型转换
    STL容器之string插入和删除
    STL容器之string字串
    STL容器之string比较
  • 原文地址:https://www.cnblogs.com/Archger/p/12774666.html
Copyright © 2011-2022 走看看