AI学习---基于TensorFlow的案例[实现线性回归的训练]

摘要:
GradientDescentOptimizer优化器=tf.train。GradientDescentOptimizer(learning_rate=0.01)最小化(错误)5设置学习率、设置步骤并确定梯度爆炸案例演示的API步骤:
  • 线性回归原理复习

        1)构建模型
               |_> y = w1x1 + w2x2 + …… + wnxn + b
        2)构造损失函数
               |_> 均方误差
        3)优化损失
               |_> 梯度下降

image

  • 实现线性回归的训练

        准备真实数据
            100样本
            x 特征值 形状 (100, 1)  100行1列
            y_true 目标值 (100, 1)
            y_true = 0.8x + 0.7    假设特征值和目标值直接的线性关系
        假定x 和 y 之间的关系 满足
            y = kx + b
            k ≈ 0.8 b ≈ 0.7
            流程分析:
            (100, 1) * (1, 1) = (100, 1)
            y_predict = x * weights(1, 1) + bias(1, 1)
            1)构建模型: 矩阵:matmul
                y_predict = tf.matmul(x, weights) + bias
            2)构造损失函数: 平均:reduce_mean  平方: square
                error = tf.reduce_mean(tf.square(y_predict - y_true))
            3)优化损失:  梯度下降的评估器GradientDescentOptimizer
                optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
            5 学习率的设置、步数的设置与梯度爆炸

  • 案例确定

image

  • API

image

  • 步骤分析

demo:

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


def linear_regression():
    """
    自实现一个线性回归
    :return:
    """
    # 1)准备数据
    with tf.variable_scope(name_or_scope='prepare_data'):
        X = tf.random_normal(shape=[100, 1], mean=2)
        y_true = tf.matmul(X, [[0.8]]) + 0.7   # [[0.8]] 定义了一个一行一列

    # 2)构造模型
    # 定义模型参数 用 变量
    with tf.variable_scope("create_model"):
        weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))  # 随机产生一个一行一列
        bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))   # 随机产生一个一行一列
        y_predict = tf.matmul(X, weights) + bias

    # 3)构造损失函数: 均方误差
    with tf.variable_scope("loss_function"):
        error = tf.reduce_mean(tf.square(y_predict - y_true))

    # 4)优化损失
    with tf.variable_scope("optimizer"):
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error) # 默认0.01

    # 显式地初始化变量
    init = tf.global_variables_initializer()

    with tf.Session() as sess:

        # 初始化变量
        sess.run(init)
        # 查看初始化模型参数之后的值
        print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
        # 开始训练
        for i in range(10):
            sess.run(optimizer)
            print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))


if __name__ == "__main__":
    linear_regression()

image

经过上面的训练我们可以发现,在学习率不变的情况下,迭代的次数越多,则效果越好。同理在迭代次数一定的情况下,学习率越高效果越好,但也是有一定限制的。

  • 学习率的设置、步数的设置与梯度爆炸

image

  • 变量的trainable设置观察

image

增加TensorBoard显示

            1)创建事件文件
            2)收集变量
            3)合并变量
            4)每次迭代运行一次合并变量
            5)每次迭代将summary对象写入事件文件

image

变量dashboard显示demo:

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


def linear_regression():
    """
    自实现一个线性回归
    :return:
    """
    # 第一步:
    # 1)准备数据
    X = tf.random_normal(shape=[100, 1], mean=2)
    y_true = tf.matmul(X, [[0.8]]) + 0.7   # [[0.8]] 定义了一个一行一列

    # 2)构造模型
    # 定义模型参数 用 变量
    # trainable=False,的时候则后面的权重会不变,导致损失也不会变化太久,默认True
    weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True)  # 随机产生一个一行一列
    bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))   # 随机产生一个一行一列
    y_predict = tf.matmul(X, weights) + bias

    # 3)构造损失函数: 均方误差
    error = tf.reduce_mean(tf.square(y_predict - y_true))

    # 4)优化损失
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    # 显式地初始化变量
    init = tf.global_variables_initializer()

    # 第二步:收集变量
    tf.summary.scalar("error", error)
    tf.summary.histogram("weights", weights)
    tf.summary.histogram("bias", bias)

    # 第三步:合并变量
    merged = tf.summary.merge_all()

    with tf.Session() as sess:

        # 初始化变量
        sess.run(init)

        # 1_创建事件文件
        file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph)

        # 查看初始化模型参数之后的值
        print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
        # 开始训练
        for i in range(100):
            sess.run(optimizer)
            print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))

            # 运行合并变量操作
            summary = sess.run(merged)
            # 将每次迭代后的变量写入事件文件
            file_writer.add_summary(summary, i)  # i是迭代次数


if __name__ == "__main__":
    linear_regression()

Tensorboard的可视化:http://ftl2018:6006/#graphs&run=.(火狐浏览器)

image

image

imageimage

  • 增加命名空间

image

增加命名空间demo

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


def linear_regression():
    """
    自实现一个线性回归
    :return:
    """
    # 第一步:
    # 1)准备数据
    with tf.variable_scope(name_or_scope='prepare_data'):
        X = tf.random_normal(shape=[100, 1], mean=2, name='feature')
        y_true = tf.matmul(X, [[0.8]]) + 0.7   # [[0.8]] 定义了一个一行一列

    # 2)构造模型
    # 定义模型参数 用 变量
    # trainable=False,的时候则后面的权重会不变,导致损失也不会变化太久,默认True
    with tf.variable_scope("create_model"):
        weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True, name='weights')  # 随机产生一个一行一列
        bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name='bias')   # 随机产生一个一行一列
        y_predict = tf.matmul(X, weights) + bias

    # 3)构造损失函数: 均方误差
    with tf.variable_scope("loss_function"):
        error = tf.reduce_mean(tf.square(y_predict - y_true))

    # 4)优化损失
    with tf.variable_scope("optimizer"):
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    # 显式地初始化变量
    init = tf.global_variables_initializer()

    # 第二步:收集变量
    tf.summary.scalar("error", error)
    tf.summary.histogram("weights", weights)
    tf.summary.histogram("bias", bias)

    # 第三步:合并变量
    merged = tf.summary.merge_all()

    with tf.Session() as sess:

        # 初始化变量
        sess.run(init)

        # 1_创建事件文件
        file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph)

        # 查看初始化模型参数之后的值
        print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
        # 开始训练
        for i in range(100):
            sess.run(optimizer)
            print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))

            # 运行合并变量操作
            summary = sess.run(merged)
            # 将每次迭代后的变量写入事件文件
            file_writer.add_summary(summary, i)  # i是迭代次数


if __name__ == "__main__":
    linear_regression()
image
  • 模型保存于加载

             saver = tf.train.Saver(var_list=None,max_to_keep=5)
            1)实例化Saver
            2)保存
                saver.save(sess, path)
            3)加载
                saver.restore(sess, path)

image

模型保存(需要提前准备好目录)与加载demo

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


def linear_regression():
    """
    自实现一个线性回归
    :return:
    """
    # 第一步:
    # 1)准备数据
    with tf.variable_scope(name_or_scope='prepare_data'):
        X = tf.random_normal(shape=[100, 1], mean=2, name='feature')
        y_true = tf.matmul(X, [[0.8]]) + 0.7   # [[0.8]] 定义了一个一行一列

    # 2)构造模型
    # 定义模型参数 用 变量
    # trainable=False,的时候则后面的权重会不变,导致损失也不会变化太久,默认True
    with tf.variable_scope("create_model"):
        weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True, name='weights')  # 随机产生一个一行一列
        bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name='bias')   # 随机产生一个一行一列
        y_predict = tf.matmul(X, weights) + bias

    # 3)构造损失函数: 均方误差
    with tf.variable_scope("loss_function"):
        error = tf.reduce_mean(tf.square(y_predict - y_true))

    # 4)优化损失
    with tf.variable_scope("optimizer"):
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    # 显式地初始化变量
    init = tf.global_variables_initializer()

    # 第二步:收集变量
    tf.summary.scalar("error", error)
    tf.summary.histogram("weights", weights)
    tf.summary.histogram("bias", bias)

    # 第三步:合并变量
    merged = tf.summary.merge_all()

    # 保存模型:创建Saver对象
    saver = tf.train.Saver(max_to_keep=5)

    with tf.Session() as sess:

        # 初始化变量
        sess.run(init)

        # 1_创建事件文件
        file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph)

        # 查看初始化模型参数之后的值
        print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
        # 开始训练
        for i in range(100):
            sess.run(optimizer)
            print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))

            # 运行合并变量操作
            summary = sess.run(merged)
            # 将每次迭代后的变量写入事件文件
            file_writer.add_summary(summary, i)  # i是迭代次数

            # 保存模型(保存模型参数,而参数在会话中)--》路径需要先创建好
            if i % 10 == 0:
                saver.save(sess, "./tmp/my_linear.ckpt")
        # # 加载模型
        # if os.path.exists("./tmp/model/checkpoint"):
        #     saver.restore(sess, "./tmp/model/my_linear.ckpt")


if __name__ == "__main__":
    linear_regression()
image
  • 命令行参数设置

      命令行参数使用
            1)tf.app.flags
                    tf.app.flags.DEFINE_integer("max_step", 0, "训练模型的步数")
                    tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路径+模型名字")
            2)FLAGS = tf.app.flags.FLAGS
                    通过FLAGS.max_step调用命令行中传过来的参数
            3、通过tf.app.run()启动main(argv)函数

image

image

具体调用:

image

命令行demo

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


# 1)定义命令行参数
tf.app.flags.DEFINE_integer("max_step", 100, "训练模型的步数")
tf.app.flags.DEFINE_string("model_dir", "Unknown", "模型保存的路径+模型名字")

# 2)简化变量名
FLAGS = tf.app.flags.FLAGS

def command_demo():
    """
    命令行参数演示
    :return:
    """
    print("max_step:
", FLAGS.max_step)
    print("model_dir:
", FLAGS.model_dir)

    return None

def main(argv):
    print("code start", argv)
    return None

if __name__ == "__main__":
    # 命令行参数演示
    # command_demo()
    tf.app.run()

免责声明:文章转载自《AI学习---基于TensorFlow的案例[实现线性回归的训练]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VScode 搭建PHP环境wpf 制作播放视频的屏保程序、而且能分屏显示下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python的变量

目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 引用的概念 在 Python 中 变量 和 数据 是分开存储的 数据 保存在内存中的一个位置 变量 中保存着数据在内存中的地址 变量 中 记录数据...

C# 编码规范、命名规则

1  规范目的 ……………………………………………………… 3 2  适用范围 ……………………………………………………… 3 3  代码注释 ……………………………………………………… 3   3.1    代码注释约定............................................ 3   3.2    模块头部注释规范.......

shell 脚本 常用命令

Shell 脚本常用命令  Shell脚本是Linux开发工作中常用的工具,但是我一直没有找到一个适合自己的简明扼要的HandBook。在工作过程中整理了一下,贴在这里已备查看。 1           Shell中的特殊符号 1.1           $  美元符号。用来表示变量的值。如变量NAME的值为Mike,则使用$NAME就可以得到“Mike...

HTML5--新增元素音频/视频(6)

前言:   这节课主要学习HTML5中新增的audio和video元素。   1.audio元素     作用:为html提供了播放音频文件的标准。     属性:       controls:         controls属性为audio控件提供了播放、暂停、音量调节等功能。       autoplay:         设置音频自动播放,音频在...

Android:在任务列表隐藏最近打开的app

对于某一个应用,如果不想在最近打开的app列表中留下任何纪录,即按下Home键回到主页,再按任务键的时候,任务列表看不到这个app,在AndroidManifest中给Activity标签添加:android:excludeFromRecents=”true”即可。 <?xml version="1.0" encoding="utf-8"?>...

jenkins动态参数插件Dynamic Parameter安装及简单使用

插件安装: 1.先下载插件hpi文件到本地   jenkins插件下载地址 http://mirror.xmission.com/jenkins/plugins/ http://updates.jenkins-ci.org/download/plugins/   dynamicparameter下载地址: http://mirror.xmission.co...