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

257 阅读3分钟

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

注意:本文使用tensorflow1.x版本进行演示

使用本地Jupyter Notebook搭载TensorFlow相关库进行操作

本文主要任务是继续完成Tensorflow线性回归案例开发,在训练好的模型基础上继续完善,为变量增加命名空间,使得代码本身结构更加清晰,同时也能够使得TensorBoard图结构更容易理解。

1. 增加命名空间

我们想为变量增加命名空间可以使用tf.variable_scope()可以修改命名空间,就会在指令名称之前出现你想要的命名。

  • 能够在OP的名字前面增加命名空间的指定名字
  • ()中添加你想要的命名
  • 在创建变量时,开启变量命名空间,可以使得图更加清晰
  • 因此对于不同的变量,可以分别开启不同的命名空间

2. 修改指令名称

在定义变量与常量数据的时候,在括号中的name部分赋予名称,即可修改指令名称。

例如:X = tf.random_normal(shape=[100,1], name="feature")为X值赋予指令名称"feature"

3. 代码演示

我们在上一篇文章的基础上,为代码进行完善,增加指令名称与命名空间,从而使得过程更加清晰,可视化结果更加一目了然。

具体代码演示如下所示:

  • 我们将添加4个命名空间
    • 为数据准备添加命名空间
    • 为模型构造添加命名空间
    • 为损失函数添加命名空间
    • 为优化损失添加命名空间
def linear_regression():
    """
    实现线性回归
    """
    with tf.variable_scope("prepare_data"):
        # 1.1 准备数据
        X = tf.random_normal(shape=[100,1], name="feature")
        y_true = tf.matmul(X, [[0.5]]) + 1 # matmul矩阵运算
    
    with tf.variable_scope("create_model"):
        # 1.2 模型构造
        # 定义模型参数
        # 用变量来定义
        weights = tf.Variable(initial_value=tf.random_normal(shape=[1,1]), name="Weights") # 需要给一个初始设置:正态分布随机初始值;一行一列
        bias = tf.Variable(initial_value=tf.random_normal(shape=[1,1]), name="Bias")
        y_predict = tf.matmul(X, weights) + bias

    with tf.variable_scope("loss_function"):
        # 1.3 损失函数
        error = tf.reduce_mean(tf.square(y_predict-y_true))
    
    with tf.variable_scope("optimizier"):
        # 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()

运行结果在当前目录下的/File/linear文件夹中-生成了新的事件文件,使用Tensorboard将其打开,可视化结果如下所示:

image.png

点开create_model节点,可视化如下所示:

image.png

由下图可以看出,从prepare_data流过来的样本值x,到了create_data节点与weight进行相乘,相乘结果与Bias进行相加得到的结果流向loss_function。有了命名空间和指令名称以后,使得TensorBoard可视化图像更加清晰,一目了然。

image.png