• Python之TensorFlow的变量收集、自定义命令参数、矩阵运算、梯度下降-4


      一、TensorFlow为什么要存在变量收集的过程,主要目的就是把训练过程中的数据,比如loss、权重、偏置等数据通过图形展示的方式呈现在开发者的眼前。

        自定义参数:自定义参数,主要是通过Python去执行,然后传入对应的参数。常见的有路径、训练次数等。

        梯度下降:这个应该是最常见的训练手段了,在监督学习中,基本上都是采用这种方式,所以了解其中的使用过程还是很多必要的。

      二、变量收集

        tf.summary.scalar(<name>, <tensor>):通过标量的方式来统计数据(简单一点有点像曲线图的方式,一般用于loss、accuary的收集)

        tf.summary.histogram(<name>, <values>):直方图的形式展示、一般用于高纬度的数据收集。

        merged = tf.summary.merge_all():合并数据,返回收集到的数据

        summary = sess.run(merged):运行收集到数据

        file_write = tf.summary.FileWriter(<logdir>,<graph=None>):记录收集数据的writer

        file_write.add_summary(<summary>, <global_step=None>):写入收集的数据,global_step为每一步长

      三、自定义命令参数

        1)首先声明需要传入的参数   

    tf.flags.DEFINE_integer("max_step", 2000, "最大训练次数")
    
    FLAGS = tf.flags.FLAGS

        注意:这里的数据类型,可以自己更具需要传入

    tf.flags.DEFINE_integer(<name>, <default_value>, <desc>)
    tf.flags.DEFINE_string(<name>, <default_value>, <desc>)

        2)替换需要手动传入的部分

    for i in range(FLAGS.max_step):   
    获取参数:
                定义:
                    FLAGS = tf.flags.FLAGS
                获取:
                    FLAGS.<name>

        3)通过Python的方式去执行*.py文件,带入参数

    python <py_name> --<name>=<value>

      四、矩阵运算

    矩阵运算:
            乘法:tf.matmul(x, y)
            平方:tf.square(error)
            均值:tf.reduce_mean(error)

      说明:矩阵运算,这里只是一少部分,实际开发中用到的需要自行查阅

      五、梯度下降

    线性回归步骤:
            1、准备特征数据和目标值
            2、建立模型 y = wx + b,主要求解w,b的值
            3、计算损失值:误差loss均方误差(y1-y1')^2 + ... + (yn - yn')^2 / n 其中:yn为特征值矩阵,yn'为平均值矩阵
            4、梯度下降,优化损失过程,需要指定学习率
    梯度下降:
            tf.train.GradientDescentOptimizer(learning_rate)
            method: minimize(loss)
            return: 梯度下降op
            学习率:
                如果学习率过大会出现梯度消失/梯度爆炸导致NaN
                优化:
                    1、重新设计网络
                    2、调整学习率
                    3、使用梯度截断
                    4、使用激活函数

      六、代码演示

    import os
    import tensorflow as tf
    
    # tf.flags.DEFINE_integer("max_step", 2000, "最大训练次数")
    #
    # FLAGS = tf.flags.FLAGS
    
    def tensorflow_linear_regression():
        with tf.variable_scope("data"):
            # 1、准备特征值和目标值
            x = tf.random_normal([100, 1], mean=1.75, stddev=0.5, name="x")
            # 矩阵相乘必须是二维(为了模拟效果而设定固定值来训练)
            y_true = tf.matmul(x, [[0.7]]) + 0.8
    
        with tf.variable_scope("model"):
            # 2、建立回归模型,随机给权重值和偏置的值,让他去计算损失,然后在当前状态下优化
            # 模型 y = wx + b, w的个数根据特征数据而定,b随机
            # 其中Variable的参数trainable可以指定变量是否跟着梯度下降一起优化(默认True)
            w = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="w", trainable=True)
            b = tf.Variable(0.0, name="b")
            # 预测值
            y_predict = tf.matmul(x, w) + b
    
        with tf.variable_scope("loss"):
            # 3、建立损失函数,均方误差
            loss = tf.reduce_mean(tf.square(y_true - y_predict))
    
        with tf.variable_scope("optimizer"):
            # 4、梯度下降优化损失
            # 学习率的控制非常重要,如果过大会出现梯度消失/梯度爆炸导致NaN
            train_op = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss)
    
        # 1)收集变量
        tf.summary.scalar("losses", loss)
        tf.summary.histogram("ws", w)
    
        # 2)合并变量
        merged = tf.summary.merge_all()
    
        tf.add_to_collection("y_predict", y_predict)
    
        # 定义一个初始化变量的op
        init_op = tf.global_variables_initializer()
    
        # 定义保存模型
        saver = tf.train.Saver()
    
        # 通过绘画运行程序
        with tf.Session() as sess:
            sess.run(init_op)
            print("运行前,权重值:%f, 偏置:%f" % (w.eval(), b.eval()))
            file_write = tf.summary.FileWriter("tmp/summary/regression", sess.graph)
    
            # 加载上次训练的模型结果
            if os.path.exists("model/checkpoint/checkpoint"):
                saver.restore(sess, "model/checkpoint/model")
    
            # 循环训练
            for i in range(2000):
            # python tensorflow_linear_regression_demo.py --max_step=1000
            # for i in range(FLAGS.max_step):
                sess.run(train_op)
                print("运行 %d 后,权重值:%f, 偏置:%f" % (i + 1, w.eval(), b.eval()))
    
                # 运行合并后的数据
                summary = sess.run(merged)
                file_write.add_summary(summary, i)
    
                # 保存模型
                if (i + 1) % 100 == 0:
                    saver.save(sess, "model/checkpoint/model")
  • 相关阅读:
    内容页超连接关键词的完美实现
    鼠标经过文字链接时出现漂亮的提示层
    简单的jQuery检测注册用户名
    触发Repeater中的Dropdownlist的SelectedIndexChanged如何获得Repeater的当前行
    读取XML的节点属性并绑定到ListBox
    第十八章 6string型字符串的替换 简单
    第十八章 2string字符串 简单
    第十七章 特殊成员_函数指针也可以做为参数 简单
    第十七章 特殊成员_类的函数指针 简单
    第十七章 特殊成员_成员函数指针数组 简单
  • 原文地址:https://www.cnblogs.com/ll409546297/p/11416818.html
Copyright © 2020-2023  润新知