深度学习基础之《TensorFlow框架(10)—案例:实现线性回归(2)》

本文介绍了如何在TensorFlow2.0中使用变量显示、TensorBoard可视化、静态图模式、模型的保存与加载,包括使用tf.summary进行变量追踪,tf.function实现动态图,以及tf.train.Checkpoint的使用方法。
摘要由CSDN通过智能技术生成

增加其他功能

一、增加变量显示

1、目的:在TensorBoard当中观察模型的参数、损失值等变量值的变化

2、收集变量
不同的变量要用不同的方式收集

(1)tf.summary.scalar(name='', tensor)
收集对于损失函数和准确率等单值变量,name为变量的名字,tensor为值

(2)tf.summary.histogram(name='', tensor)
收集高维度的变量参数

(3)tf.summary.image(name='', tensor)
收集输入的图片张量,能显示图片

3、合并变量写入事件文件
(1)merged = tf.summary.merge_all()

4、修改代码(tensorflow2.0版本写法)

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf

def tensorflow_demo():
    """
    TensorFlow的基本结构
    """

    # TensorFlow实现加减法运算
    a_t = tf.constant(2)
    b_t = tf.constant(3)
    c_t = a_t + b_t
    print("TensorFlow加法运算结果:\n", c_t)
    print(c_t.numpy())

    # 2.0版本不需要开启会话,已经没有会话模块了

    return None

def graph_demo():
    """
    图的演示
    """
    # TensorFlow实现加减法运算
    a_t = tf.constant(2)
    b_t = tf.constant(3)
    c_t = a_t + b_t
    print("TensorFlow加法运算结果:\n", c_t)
    print(c_t.numpy())

    # 查看默认图
    # 方法1:调用方法
    default_g = tf.compat.v1.get_default_graph()
    print("default_g:\n", default_g)

    # 方法2:查看属性
    # print("a_t的图属性:\n", a_t.graph)
    # print("c_t的图属性:\n", c_t.graph)

    # 自定义图
    new_g = tf.Graph()
    # 在自己的图中定义数据和操作
    with new_g.as_default():
        a_new = tf.constant(20)
        b_new = tf.constant(30)
        c_new = a_new + b_new
        print("c_new:\n", c_new)
        print("a_new的图属性:\n", a_new.graph)
        print("b_new的图属性:\n", b_new.graph)

    # 开启new_g的会话
    with tf.compat.v1.Session(graph=new_g) as sess:
        c_new_value = sess.run(c_new)
        print("c_new_value:\n", c_new_value)
        print("我们自己创建的图为:\n", sess.graph)

    # 可视化自定义图
    # 1)创建一个writer
    writer = tf.summary.create_file_writer("./tmp/summary")
    # 2)将图写入
    with writer.as_default():
        tf.summary.graph(new_g)

    return None

def session_run_demo():
    """
    feed操作
    """
    tf.compat.v1.disable_eager_execution()
    
    # 定义占位符
    a = tf.compat.v1.placeholder(tf.float32)
    b = tf.compat.v1.placeholder(tf.float32)
    sum_ab = tf.add(a, b)
    print("a:\n", a)
    print("b:\n", b)
    print("sum_ab:\n", sum_ab)
    # 开启会话
    with tf.compat.v1.Session() as sess:
        print("占位符的结果:\n", sess.run(sum_ab, feed_dict={a: 1.1, b: 2.2}))
 
    return None

def tensor_demo():
    """
    张量的演示
    """
    tensor1 = tf.constant(4.0)
    tensor2 = tf.constant([1, 2, 3, 4])
    linear_squares = tf.constant([[4], [9], [16], [25]], dtype=tf.int32)
    print("tensor1:\n", tensor1)
    print("tensor2:\n", tensor2)
    print("linear_squares:\n", linear_squares)

    # 张量类型的修改
    l_cast = tf.cast(linear_squares, dtype=tf.float32)
    print("before:\n", linear_squares)
    print("l_cast:\n", l_cast)

    return None

def variable_demo():
    """
    变量的演示
    """
    a = tf.Variable(initial_value=50)
    b = tf.Variable(initial_value=40)
    c = tf.add(a, b)
    print("a:\n", a)
    print("b:\n", b)
    print("c:\n", c)
    with tf.compat.v1.variable_scope("my_scope"):
        d = tf.Variable(initial_value=30)
        e = tf.Variable(initial_value=20)
        f = tf.add(d, e)
    print("d:\n", d)
    print("e:\n", e)
    print("f:\n", f)
    return None

def linear_regression():
    """
    自实现一个线性回归
    """
    # 1、准备数据
    x = tf.random.normal(shape=[100,1])
    y_true = tf.matmul(x, [[0.8]]) + 0.7

    # 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
    
    # 3、构造损失函数
    error = tf.reduce_mean(tf.square(y_predict - y_true))

    # 4、优化器
    #optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
    optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
    
    # 创建事件文件
    file_writer = tf.summary.create_file_writer("./tmp/summary")

    # 收集变量
    with file_writer.as_default():
        tf.summary.experimental.set_step(0)
        # 记录标量变量
        tf.summary.scalar("error", error)
        # 记录变量的直方图
        tf.summary.histogram("weights", weights)
        tf.summary.histogram("bias", bias)
    
    # 5、查看初始化模型参数之后的值
    print("训练前模型参数为:权重%f,偏置%f,损失%f" % (weights, bias, error))

    # 6、开始训练
    num_epoch = 200 # 定义迭代次数
    
    for e in range(num_epoch): # 迭代多次
        with tf.GradientTape() as tape:
            y_predict = tf.matmul(x, weights) + bias
            error = tf.reduce_mean(tf.square(y_predict - y_true))
            #error = loss_function(y_predict, y_true)
        grads = tape.gradient(error, [weights, bias]) # 求损失关于参数weights、bias的梯度
        optimizer.apply_gradients(grads_and_vars=zip(grads, [weights, bias])) # 自动根据梯度更新参数,即利用梯度信息修改weights与bias,使得损失减小
   
        # 每个步骤记录变量
        with file_writer.as_default():
            tf.summary.experimental.set_step(e + 1)
            # 记录标量变量
            tf.summary.scalar("error", error)
            # 记录变量的直方图
            tf.summary.histogram("weights", weights)
            tf.summary.histogram("bias", bias)

    file_writer.close()
    print("训练后模型参数为:权重%f,偏置%f,损失%f" % (weights, bias, error))

    return None

if __name__ == "__main__":
    # 代码1:TensorFlow的基本结构
    # tensorflow_demo()
    # 代码2:图的演示
    #graph_demo()
    # feed操作
    #session_run_demo()
    # 代码4:张量的演示
    #tensor_demo()
    # 代码5:变量的演示
    #variable_demo()
    # 代码6:自实现一个线性回归
    linear_regression()

 运行结果:

训练前模型参数为:权重1.398883,偏置-0.596879,损失1.965775
训练后模型参数为:权重0.823115,偏置0.676830,损失0.001003

5、查看TensorBoard

二、TensorFlow2.0如何显示静态图

1、在TensorFlow1.0时代,采用的是静态计算图,需要先使用TensorFlow的各种算子创建计算图,然后再开启一个会话Session,显式执行计算图

2、而在TensorFlow2.0时代,采用的是动态计算图,即每使用一个算子后,该算子会被动态加入到隐含的默认计算图中立即执行得到结果,而无需开启Session

3、如果需要在TensorFlow2.0中使用静态图,可以使用@tf.function装饰器将普通Python函数转换成对应的TensorFlow计算图构建代码。运行该函数就相当于在TensorFlow1.0中用Session执行代码。使用tf.function构建静态图的方式叫做Autograph

4、计算图简介
计算图由节点(nodes)和线(edges)组成
节点表示操作符Operator,或者称之为算子,线表示计算间的依赖
实线表示有数据传递依赖,传递的数据即张量
虚线通常可以表示控制依赖,即执行先后顺序

5、因为代码里用到了变量,没法用tf.function把静态图弄出来

三、模型的保存与加载

1、tf.train.Saver(var_list=None, max_to_keep=5)
说明:
(1)保存和加载模型(保存文件格式:checkpoint文件)
(2)var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递
(3)max_to_keep:指示要保留的最近检查点文件的最大数量。创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件。默认为5(即保留最新的5个检查点文件)

2、tf.train.Checkpoint创建检查点(tensorflow2.0版本)
(1)Checkpoint.save():保存变量
(2)Checkpoint.restore():恢复变量
(3)优化器tf.keras.optimizer,变量tf.Variable,层tf.keras.Layer和模型tf.keras.Model实例都可以被保存

3、tf.train.CheckpointManager管理检查点(tensorflow2.0版本)

四、小结

深度学习介绍
    深度学习与机器学习区别
        特征工程
        数据量和计算性能的要求
        算法的改进方面
TensorFlow框架介绍
    TensorFlow整体结构
        图:定义数据(Tensor对象)和操作(Operation对象)
        执行图:在会话中执行
    图
        默认图
        自定义图
    会话
    张量
        属性
            shape
            dtype
        生成
        修改属性
            修改张量类型
            修改张量形状
                静态形状
                动态形状
        运算
    操作
        操作函数&操作对象
    变量
        特点:存储模型参数
        显示的初始化变量
        修改变量的命名空间
    TensorBoard可视化
        创建事件文件
        通过tensorboard --logdir启动

参考资料:
https://www.cnblogs.com/xiximayou/p/12673167.html
https://zhuanlan.zhihu.com/p/102776848
 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值