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

news2024/11/15 22:12:30

增加其他功能

一、增加变量显示

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、修改代码

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把静态图弄出来
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1538694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是行业垂直类媒体?有哪些?怎么邀约

传媒如春雨,润物细无声,大家好,我是51媒体胡老师。 行业垂直类媒体是聚焦于特定行业或领域的媒体平台。 行业垂直类媒体不同于主流媒体,它们专注于提供与某个特定领域相关的深入内容和服务,例如商业新闻、旅游、数字…

WMI接口设计实现

WMI是Windows操作系统管理数据和操作的基础设施,系统管理员可以使用VB Script、PowerShell及Windows API(C、C#等)管理本地或远程计算机。 使用WMI框架应用程序可以直接访问EC RAM、 I/O端口、Memory地址、寄存器、Setup NV设定值&#xff0c…

vue 安装脚手架报错 certificate has expired

vue 安装脚手架的时候报错,报错信息如下: 错误信息:npm ERR! request to https://registry.npm.taobao.org/vue%2fcli failed, reason: certificate has expired 翻译:npm ERR!请求到https://registry.npm.taobao.org…

【C++练级之路】【Lv.15】AVL树(双子旋转,领略绝对平衡之美)

快乐的流畅:个人主页 个人专栏:《C语言》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、AVL树的概念二、AVL树的模拟实现2.1 结点2.2 成员变量2.3 插入2.4 旋转2.4.1 左单旋2.4.2 右单旋2.4.3 …

python文学名著分享系统的设计与实现flask-django-nodejs-php

在此基础上,结合现有文学名著分享体系的特点,运用新技术,构建了以python为基础的文学名著分享信息化管理体系。首先,以需求为依据,根据需求分析结果进行了系统的设计,并将其划分为管理员和用户二种角色和多…

自己的博客阵地(互联网核心之一 DNS)

DNS(Domain Name System)是一种用于将易记的域名映射到计算机网络中的 IP 地址的系统。它充当互联网上计算机和网络设备的地址簿,使人们可以使用便于记忆的域名来访问网站,而不必记住复杂的数字IP地址。(完全合格域名) 名字号联系…

Milvus 向量数据库介绍及使用

一、Milvus 介绍及安装 Milvus 于 2019 年创建,其目标只有一个:存储、索引和管理由深度神经网络和其他机器学习 (ML) 模型生成的大量嵌入向量。它具备高可用、高性能、易拓展的特点,用于海量向量数据的实时召回。 作为专门为处理输入向量查…

题目:异或森林(蓝桥OJ 3400)

问题描述&#xff1a; 解题思路&#xff1a; 一个数也可以看作是一段区间&#xff0c;当该区间的异或和为完全平方数时则符合题意。 我们需要注意枚举的完全平方的上限。 异或前缀和减小时间复杂度。 题解&#xff1a; #include <bits/stdc.h> using namespace std; usi…

MATLAB中的数学建模:基础知识、实例与方法论

前言 在当今科技高速发展的时代&#xff0c;数学建模成为了解析复杂世界的关键工具&#xff0c;而MATLAB作为一种专业的科学计算软件&#xff0c;为我们提供了强大的数学建模平台。MATLAB不仅仅是Matrix Laboratory的简称&#xff0c;更是一个集数值分析、矩阵计算、算法开发和…

如何做好软件架构

最近学习了Udemy的一个软件架构课程&#xff0c;在此做一个记录和分享。 总的来说&#xff0c;软件架构是基于实际业务需求&#xff0c;无法为实际业务服务&#xff0c;再花哨的软件架构都无法产生任何价值。 当需求到来&#xff0c;我们需要分以下几个大致步骤进行分析和拆解…

【项目设计】仿 muduo 库实现 OneThreadOneEventLoop 式并发服务器

文章目录 一、项目介绍1. 项目简介2. 开发环境3. 核心技术4. 开发阶段 二、前置知识了解1. reactor2. timerfd3. timerwheel4. eventfd5. regex6. any 三、框架设计1. 项目模块划分1.1 SERVER 模块1.2 协议模块 2. 项目模块关系图2.1 Connection 模块关系图2.2 Acceptor 模块关…

抖音视频关键词批量采集工具|视频无水印爬虫下载软件

抖音视频关键词批量采集工具&#xff1a; 最新推出的抖音视频关键词批量采集工具&#xff0c;为您提供一种便捷的方式通过关键词搜索和提取符合条件的视频内容。以下是详细的操作说明和功能解析&#xff1a; 操作说明&#xff1a; 进入软件后&#xff0c;在第一个选项卡页面…

Linux centos7安装nginx-1.24.0并且实现自启动

1.安装之前的操作 ps -ef|grep nginx 查看是否有运行 如果有就杀掉 kill -9 pid find / -name nginx 查看nginx文件 rm -rf file /usr/local/nginx* 通通删掉删掉 yum remove nginx 限载一下服务 1.2.下载安装包 地址 nginx: download 2.减压文件 tar…

shell常用通配符

目录 介绍 示例 * ? [a,b,...] / [ab...] [^a,b,...] / [^ab...] [x1-x2] {"xxx","xxx","xxx",...} {x1..x2} 介绍 示例 * 匹配0或多个字符 ls的-d选项可以只列出当前目录下的文件,而不会列出他们包含的内容: ? 只匹配任意一个字符 …

JAVA_Tomcat

Tomcat 使用教程 1.下载: http://tomcat.apache.org/ 2.安装: 解压压缩包(安装目录不要有中文) 3.卸载: 删除目录即可 4.启动: 运行./bin/startup.sh1.黑窗口一闪而过: 没有配置好JDK环境变量2.启动报错(查看日志文件): 端口占用 5.关闭: 1.强制关闭: 点击窗口关闭按钮2.正常…

Vue3 大量赋值导致reactive响应丢失问题

问题阐述 如上图所示&#xff0c;我定义了响应式对象arrreactive({data:[]})&#xff0c;尝试将indexedDB两千条数据一口气赋值给arr.data。但事与愿违&#xff0c;页面上的{{}}在展示先前数组的三秒后变为空。 问题探究 vue3的响应应该与console.log有异曲同工之妙&#xff0…

js教程(8)

一、事件流 1.概述 在JavaScript中&#xff0c;事件流描述的是事件在DOM结构中传播和被处理的顺序。事件流分为冒泡阶段和捕获阶段。 冒泡阶段&#xff08;Bubbling Phase&#xff09;&#xff1a;事件首先从最内层的元素开始向父级元素传播&#xff0c;一直传播到最外层的元素…

分布式Raft原理详解,从不同角色视角分析相关状态

分布式Raft原理详解&#xff0c;从不同角色视角分析相关状态 1. CAP定理2.Raft 要解决的问题3. Raft的核心逻辑3.1. Raft的核心逻辑2.1. 复制状态机2.2. 任期 Term2.3. 任期的意义&#xff1a;逻辑时钟2.4 选举定时器 3. Leader选举逻辑4. 从节点视角查看Leader选举4.1. Follow…

备考ICA----Istio实验7---故障注入 Fault Injection 实验

备考ICA----Istio实验7—故障注入 Fault Injection 实验 Istio 的故障注入用于模拟应用程序中的故障现象&#xff0c;以测试应用程序的故障恢复能力。故障注入有两种: 1.delay延迟注入 2.abort中止注入 1. 环境准备 kubectl apply -f istio/samples/bookinfo/platform/kube/…

计算机二级总结

1.结构体改值&#xff1a; ②第二套1 对形参b所指结构体的数据进行修改 1.结构体传参传地址&结构体 2.在函数里用->,在main里用.&#xff0c;数组用. ②第五套1 对形参b所指结构体的数据进行修改 返回指针变量的地址&#xff0c;不用取*&#xff0c;所以用struct stud…