zoukankan      html  css  js  c++  java
  • 莫烦tensorflow学习记录 (3)建造我们第一个神经网络

    另一个学习文档http://doc.codingdict.com/tensorflow/tfdoc/tutorials/overview.html

    定义 add_layer()

    https://mofanpy.com/tutorials/machine-learning/tensorflow/add-layer/

    import tensorflow as tf
    
    def add_layer(inputs,in_size,out_size,activation_function=None): #定义添加神经层的函数def add_layer(),它有四个参数:输入值、输入的大小、输出的大小和激励函数,我们设定默认的激励函数是None。
        # 因为在生成初始参数时,随机变量(normal distribution)会比全部为0要好很多,所以我们这里的weights为一个in_size行, out_size列的随机变量矩阵。
        Weights = tf.Variable(tf.random_normal([in_size,out_size]))
        # 机器学习中推荐biases不为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)
            
        return outputs

    建造神经网络

    这次提到了怎样建造一个完整的神经网络,包括添加神经层,计算误差,训练步骤,判断是否在学习

    import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    
    def add_layer(inputs,in_size,out_size,activation_function=None): #定义添加神经层的函数def add_layer(),它有四个参数:输入值、输入的大小、输出的大小和激励函数,我们设定默认的激励函数是None。
        # 因为在生成初始参数时,随机变量(normal distribution)会比全部为0要好很多,所以我们这里的weights为一个in_size行, out_size列的随机变量矩阵。
        Weights = tf.Variable(tf.random_normal([in_size,out_size]))
        # 机器学习中推荐biases不为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)
    
        return outputs
    
    # 虚构一个所需的数据
    # 这里的x_data和y_data并不是严格的一元二次函数的关系,
    # 因为我们多加了一个noise,这样看起来会更像真实情况。
    x_data = np.linspace(-1,1,300)[:, np.newaxis]
    noise = np.random.normal(0, 0.05, x_data.shape)
    y_data = np.square(x_data) - 0.5 + noise # y=x^2 -0.5
    
    # 利用占位符定义我们所需的神经网络的输入。 tf.placeholder()就是代表占位符,
    # 这里的None代表无论输入有多少都可以,因为输入只有一个特征,所以这里是1。
    xs = tf.placeholder(tf.float32, [None, 1])
    ys = tf.placeholder(tf.float32, [None, 1])
    
    # 建立2个隐藏层,输入层只有一个特征,建立2个隐藏层,每层10个神经元,输出也是一个特征,激励函数用的tf.nn.relu,tf.nn.tanh.激励函数有很多比如tf.nn.sigmoid
    l1 = add_layer(xs, 1, 10,activation_function=tf.nn.relu)
    l2 = add_layer(l1, 10, 10,activation_function=tf.nn.tanh)
    
    prediction = add_layer(l2,10,1,activation_function=None) # 输出特征
    
    # 损失函数
    # 计算预测值prediction和真实值的误差,对二者差的平方求和再取平均。
    loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1])) #reduction_indices参数的值为1的时候,是第1维对应位置相加
    
    # 练习
    train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #训练,采用梯度下降法,学习率为0.1优化的步长取值,学习方向减小loss
    
    # 初始化变量
    init = tf.global_variables_initializer()
    
    # 上面所有的都还没有运行
    # 定义Session,并用 Session 来执行 init 初始化步骤。
    # (注意:在tensorflow中,只有session.run()才会执行我们定义的运算。)
    sess = tf.Session()
    sess.run(init) # 这里运行了init
    
    #可视化
    # Pycharm可以在【Settings】-->【Python Scientific】-->取消“Show plots……”的勾
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    ax.scatter(x_data,y_data)
    plt.ion() # 使图像可动态
    plt.show()
    
    # 这里,我们让机器学习1000次。机器学习的内容是train_step,
    # 用 Session 来 run 每一次 training 的数据,逐步提升神经网络的预测准确性。
    # (注意:当运算要用到placeholder时,就需要feed_dict这个字典来指定输入。)
    for i in range(1000):
        sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
        # 每50步我们输出一下机器学习的误差。
        # 每隔50次训练刷新一次图形,用红色、宽度为5的线来显示我们的预测数据和输入之间的关系,并暂停0.1s。
        if i % 50 == 0:
            print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
    
            try:
                ax.lines.remove(lines[0])
            except Exception:
                pass
            prediction_value = sess.run(prediction, feed_dict={xs:x_data})
            lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
            plt.pause(0.1)
    
    plt.pause(0) # 完成运行后图片不消失

    加速神经网络训练 (Speed Up Training)

    Tensorflow 中的优化器会有很多不同的种类。最基本, 也是最常用的一种就是GradientDescentOptimizer

    在Google搜索中输入“tensorflow optimizer可以看到Tensorflow提供了7种优化器

    各种优化器的特点https://mofanpy.com/tutorials/machine-learning/tensorflow/intro-speed-up-learning/

     

  • 相关阅读:
    软件工程结对作业
    软件工程第二次作业
    软件工程第一次作业
    MATLAB安装教程
    实现生成小学四则运算练习题
    结对编程-审查代码
    软件第三次作业
    练习使用Eclipse进行单元测试
    软件工程第一次作业
    Visual Studio Code (vscode)
  • 原文地址:https://www.cnblogs.com/aimoboshu/p/13806092.html
Copyright © 2011-2022 走看看