【深度学习】TensorFlow线性回归案例演示(3)

语言: CN / TW / HK

highlight: a11y-dark theme: nico


持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

1. 案例回顾

上一篇文章我们搭建了完整线性回归模型并进行1000轮训练,达到了较为不错的效果。本文将主要介绍在完整机器学习中的其他功能与流程,比如将训练损失可视化,Tensorboard显示变量,自定义增加命名空间,模型保存等等。

2. 增加变量显示

在TensorBoard当中观察模型的参数、损失值等变量值的变化。不同的数据要用不同的方式去收集,比如标量数据用.scalar,高维度数据用.histogram等。

收集变量: - tf.summary.scalar(name='', tensor)收集对于损失函数和准确率等单值变量(标量),name为变量的名字,tensor为值。 - tf.summary.histogram(name='', tensor)收集高维度的变量参数(权重和偏置变化状况) - tf.summary.image(name='', tensor)收集输入的图片张量能显示图片

合并变量写入事件文件 - merged=tf.summary.merge_all():将权重偏置都搜集到一起 - 运行合并:summary = sess.run(merged),每次迭代都需在会话中运行 - 添加:FileWriter.add_summary(summary, i)i表示第几次的值,将summary对象写入到事件文件中

3. 代码演示

步骤1:导入所需库

ipython import tensorflow as tf import tensorflow.compat.v1 as tf tf.disable_v2_behavior()

步骤2:线性回归并收集变量

  • 我们在./File/linear目录下创建了事件文件,用来保存变量中间结果
  • 需要在训练时的每一次循环后将变量写入事件
  • 本案例演示中,主要用到收集变量与变量合并写入事件,最终得到可视化结果
  • 主要流程为:

    1. 创建事件
    2. 收集变量
    3. 合并变量
    4. 写入变量 ```ipython def linear_regression(): """ 实现线性回归 """

    1.1 准备数据

    X = tf.random_normal(shape=[100,1]) y_true = tf.matmul(X, [[0.5]]) + 1 # matmul矩阵运算

    1.2 模型构造

    定义模型参数

    用变量来定义

    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

    1.3 损失函数

    error = tf.reduce_mean(tf.square(y_predict-y_true))

    1.4 优化损失

    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    2) 收集变量

    tf.summary.scalar("error", error) tf.summary.histogram("weights", weights) tf.summary.histogram("bias", bias)

    3) 合并变量

    merged = tf.summary.merge_all()

    2. 初始化变量

    init = tf.global_variables_initializer()

    3. 开启会话

    with tf.Session() as sess: sess.run(init)

    # 1) 创建事件文件
    file_writer = tf.summary.FileWriter("./File/linear", graph=sess.graph)
    
    # 查看初始化模型参数的值
    print("训练前模型参数为:权重%f, 偏置%f, 损失%f" %(weights.eval(), bias.eval(), error.eval()))
    
    # 4. 开始训练
    for i in range(1000):
        sess.run(optimizer)
        print("第%d次训练后模型参数为:权重%f, 偏置%f, 损失%f" %(i+1, weights.eval(), bias.eval(),error.eval()))
    
        # 运行合并变量操作
        summary = sess.run(merged)
        # 将每次迭代后的变量写入事件文件
        file_writer.add_summary(summary, i)
    

    return None

linear_regression() ``` 经过1000轮训练得到的结果如下图所示:

image.png

步骤3:TensorBoard可视化

同时,我们还在当前目录下建立了新的目录,File/linear。在这个目录下记录了变量的变化过程,我们可以使用Tensorboard将其打开,查看可视化训练过程。

image.png

File文件中是刚才保存变量的事件,需要Tensorboard将其打开查看。

image.png

需要我们打开anaconda promp,然后在其中进入到安装tensorflow的虚拟环境中。进入到事件所在上级目录。

cd 文件保存上级目录path

tensorboard --logdir=./File/linear/

可视化图结果如下所示:

image.png

模型损失变化图如下所示:

image.png

权重weight与偏置bias项变化过程如下所示:

image.png

权重weight与偏置bias分布直方图如下所示:

image.png