TensorFlow1和TensorFlow2介绍

news2024/11/15 17:51:41

 

目录

一.安装

二.TensorFlow结构分析

数据流图介绍

三.图与TensorBoard

1.图结构

2.图的相关操作

 3.自定义图

4.开启会话Session中指定使用那个图

四.TensorBoard:可视化

1.数据序列化-events文件

2.启动TensorBoard

3.tensorflow2中使用tensorboard

1.使用Model.fit()训练

2.TensorBoard的参数解释:

五:OP

1.常见的OP有

2.指令名称

六.会话

1.Sessionj(target='',graph=None,config=None)

2.会话中的run()

3.feed操作

七.张量

1.张量的类型

2.张量的阶

 3.创建张量的指令

4.张量的变换

八.变量OP

1.创建变量

总结:


一.安装

pip install tensorflow

二.TensorFlow结构分析

图:这是TensorFlow将计算表示为指令之间的依赖关系的一种表示方法

会话:这是TensorFlow跨一个或者多个本地或者远程设备运行数据流图的机制(tensorflow2中不用)

TensorFlow程序通常被组织成一个构建图阶段和一个执行图阶段。在构建图阶段,数据于操作的执行步骤被描述成一个图。在执行阶段,使用会话执行构建好的图中的操作。

import tensorflow as tf  # 导入tensorflow

tf.Graph() # 构建图阶段

a=tf.constant(50)  # 将这三步操作放在图上
b=tf.constant(30)
c=tf.add(a,b)


with tf.Session() as sess:  # 使用会话执行图阶段
    add_c=sess.run(c)
    print(add_c)

运行代码的时候会有警告,可以使用命令关闭


# 关闭警告
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf  # 导入tensorflow


a=tf.constant(50)  # 将这三步操作放在图上
b=tf.constant(30)
c=tf.add(a,b)


with tf.compat.v1.Session() as sess:  # 使用会话执行图阶段
    add_c=sess.run(c)
    print(add_c)

数据流图介绍

上图中是一个SGD的训练图,从下往上看,先输入数据,然后对这个数据标记和整理形状,在对数据进行一系列的数学操作,然后计算损失和更新参数。 

三.图与TensorBoard

1.图结构

图包含了一组tf.operation代表的计算单元对象和tf.Tensor代表的计算单元之间流动的数据

2.图的相关操作

创建图:tf.Graph()

查看图:tf.get_default_graph()访问,

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

a=tf.constant(50)
b=tf.constant(30)
# 创建操作
c=tf.add(a,b)

# 查看默认的图
print(tf.get_default_graph())
# 查看数据的图属性
print(a.graph)
print(b.graph)
# 查看操作的图属性
print(c.graph)


with tf.Session() as sess:
    add_c=sess.run(c)
    print(add_c)

打印出来后可以看到 同一个图中的属性,操作,图,对象都是一样的

 3.自定义图

new_graph=tf.Graph()
print(new_graph)

4.开启会话Session中指定使用那个图

with tf.Session(graph=new_graph) as sess:
    print(sess.run(c))

四.TensorBoard:可视化

TensorFlow可用于训练大规模深度神经网络所需的计算,为了更方便TensorFlow程序的理解,调试与优化,TensorFlow提供了TensorBoard可视化工具

1.数据序列化-events文件

TensorBoard通过读取TensorFlow的事件文件来运行,需要将数据生成一个序列化的Summary protobuf对象。

# 使用filewriter,写入事件文件到指定目录(最好用绝对路径),以提供给tensorboard使用
tf.summary.FileWriter('./tmp/summary/test/', graph=sess.graph)

 这将在指定目录中生成一个event文件

2.启动TensorBoard

在终端中输入命令,指定上面生成的文件路径

tensorboard --logdir="./tmp/tensorflow/summary/test/"

在浏览器中打开TensorBoard的图页面127.0.0.1:6006

3.tensorflow2中使用tensorboard

以上是基于tensorflow1版本的使用方法,而在2中则没有Session也就是会话这一步骤了

在tensirflow2中tensorboard,参考官方文档:

1.使用Model.fit()训练

直接使用tf.keras中的callbacks就可以在训练时写入训练信息,训练结束后在命令行调用TensorBoard就可以了。

构建一个模型来测试以下

import tensorflow as tf
import tensorboard
import datetime

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

def create_model():
  return tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax')
  ])

model = create_model()
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 定义日志目录,必须是启动web应用时指定目录的子目录,建议使用日期时间作为子目录名
log_dir="/home/chb/jupyter/logs/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)  # 定义TensorBoard对象

model.fit(x=x_train, 
          y=y_train, 
          epochs=5, 
          validation_data=(x_test, y_test), 
          callbacks=[tensorboard_callback])  # 将定义好的TensorBoard对象作为回调传给fit方法,这样就将TensorBoard嵌入了模型训练过程

也就是要先构建好这个模型的保存路径,然后使用 tf.keras.callbacks.TensorBoard将这个路径定义为对象,然后在训练的时候将定义好的对象作为回调传给fit方法,这样就将TensorBoard写入训练模型过程了

训练结束后在命令行中输入命令:

tensorboard --logdir fit_logs

然后点显示的http地址就可以看到

 

通过TensorBoard提供的图标,我们可以清楚的知道训练模型时loss和accuracy在每一个epoch中怎么变化的,在网页菜单中我们可以看到还有其他功能

scalars:可以看到accuracy,cross entropy,dropout ,bias,weights等的趋势

在images和audio下可以看到输入的数据

在graphs中可以看到模型的结构

在histogram可以看到activations,gradients或者weights等变化量的每一步分布,越靠前面就是越新的步数的结果

distribution和histogram是两种不同的形式,可以看到整体的形状

在embedding中可以看到PCA主成分分析方法将高维数据投影到3D空间的数据关系

2.TensorBoard的参数解释:

log_dir:保存TensorBoard要解析的日志文件的目录的路径

histogram_freq:频率(在epoch中),计算模型层的激活和权重直方图。如果设置为0,则不会计算直方图。必须为直方图可视化指定验证数据(或拆分)

write_graph:是否在TensorBoard中可视化渐变直方图,histogram_freq必须大于0

batch_size:用以直方图计算的传入神经元网格输入批的大小

write_images:是否在TensorBoard中编写模型权重以显示为图像

embeddings_freq:将保存所选嵌入层的频率(在epoch中)。如果设置为0,则不会计算嵌入。要在TensorBoard的嵌入选项卡中显示的数据必须作为embeddings_data传递。
embeddings_layer_names:要关注的层名称列表。如果为None或空列表,则将监测所有嵌入层。
embeddings_metadata:将层名称映射到文件名的字典,其中保存了此嵌入层的元数据。如果相同的元数据文件用于所有嵌入层,则可以传递字符串。
embeddings_data:要嵌入在embeddings_layer_names指定的层的数据。Numpy数组(如果模型有单个输入)或Numpy数组列表(如果模型有多个输入)。
update_freq:‘batch’或’epoch’或整数。使用’batch’时,在每个batch后将损失和指标写入TensorBoard。这同样适用’epoch’。如果使用整数,比方说1000,回调将会在每1000个样本后将指标和损失写入TensorBoard。请注意,过于频繁地写入TensorBoard会降低您的训练速度。 还有可能引发的异常:
ValueError:如果设置了histogram_freq且未提供验证数据。

五:OP

1.常见的OP有

也就是操作对象比如上面的tf.add,一个操作对象(Operation)是TensorFlow图中的一个节点,可以接收0个或者多个输入Tensor,并且可以输出0个或多个Tensor,Operation对象是通过op构造函数,比如tf.matmul()创建的。

例如:c=tf.matmul(a,b)创建了一个Operation对象,类型为MatMul类型,它将张量a,b作为输入,c作为输出,并且输出数据,打印的时候也是打印数据,其中tf.matmul()是函数,在执行matmul函数的过程中会通过MatMul类创建一个与之对应的对象

con_a=tf.constant(50)
con_b=tf.constant(50)
con_c=tf.add(a,b)

print("打印con_a:\n", con_a)
print("打印con_b:\n", con_b)
print("打印sum_c:\n", sum_c)


# 打印后显示:
"""
打印con_a:
 Tensor("Const:0", shape=(), dtype=float32)
打印con_b:
 Tensor("Const_1:0", shape=(), dtype=float32)
打印sum_c:
 Tensor("Add:0", shape=(), dtype=float32)
"""

打印出来的是张量值,可以理解成OP当中包含了这个值。并且每一个OP指令都对应一个唯一的名称,比如上面的Const:0 这个在TensorBoard上面也可以显示

注意:tf.Tensor对象以输出张量的tf.Operation明确命名。张量名称形式为"<OP_NAME>:<i>"。其中<OP_NAME>是生成该张量的名称<i>是一个整数,它表示该张量在指令的输出中的索引(一般都是0)

2.指令名称

tf.Graph对象为其包含的tf.Operation对象定义的一个命名空间。TensorFlow会制动为图中的每一个指令选择一个唯一的名称,用户也可以指定描述性名称。例如tf.constant(50, name='num')创建了一个名为"num"的新tf.Operation并返回一个名为"num:0"的tf.Tensor。如果图里面以包含名为num1的指令,则会在名称上加上1,2等字符来保证名称的唯一性

六.会话

一个运行TensorFlow operation的类,会话包含以下两种开启方式

it.Session:用于完整的程序当中

tf.InteractiveSession:用于交互上下文中的TensorFlow,例如shell

1.Sessionj(target='',graph=None,config=None)

会话可能拥有的资源,如 tf.Variable,tf.QueueBase和tf.ReaderBase。当这些资源不再需要时,释放这些资源非常重要。因此,需要调用tf.Session.close会话中的方法,或将会话用作上下文管理器。

target:如果将此参数留空(默认设置),会话将仅使用本地计算机中的设备。可以指定 grpc:// 网址,以便指定 TensorFlow 服务器的地址,这使得会话可以访问该服务器控制的计算机上的所有设备。
graph:默认情况下,新的 tf.Session 将绑定到当前的默认图。
config:此参数允许您指定一个 tf.ConfigProto 以便控制会话的行为。例如,ConfigProto协议用于打印设备使用信息

2.会话中的run()

run(fetches,feed_dict=None, options=None, run_metadata=None)
通过使用sess.run()来运行operation
fetches:单一的operation,或者列表、元组(其它不属于tensorflow的类型不行)
feed_dict:参数允许调用者覆盖图中张量的值,运行时赋值
与tf.placeholder搭配使用,则会检查值的形状是否与占位符兼容。

3.feed操作

placeholder提供占位符,run时候通过feed_dict指定参数

def session_run_demo():
    """
    会话的run方法
    :return:
    """
    # 定义占位符
    a = tf.placeholder(tf.float32)
    b = tf.placeholder(tf.float32)
    sum_ab = tf.add(a, b)
    print("sum_ab:\n", sum_ab)
    # 开启会话
    with tf.Session() as sess:
        print("占位符的结果:\n", sess.run(sum_ab, feed_dict={a: 3.0, b: 4.0}))
    return None

七.张量

TensorFlow的张量是一个n维数组,类型为tf.Tensor。Tensor具有两个属性:type数据类型和shape形状(阶)

1.张量的类型

2.张量的阶

 

形状只有0阶,1阶,2阶

tensor1=tf.constant(4)
tensor2=tf.constant([1,2,3,4])
linear_squares=tf.constant([[4],[9],[16],[25]],dtype=int32)

print(tensor1.shape)

 3.创建张量的指令

1.tf.zeros(shape,dtype=tf.float32,name=None)创建一个都是0的张量,

2.tf.zeros_like(tensor,dtype=None,name=None)创建一个形状像tensor的全为0的张量

3.tf.ones(shape,dtype=None,name=None)创建一个全为1的张量

4.tf.ones_like(tensor,dtype=None,name=None)创建一个形状和tensor相同的全为1的张量

5.tf.fill(dims, value ,name=None)创建一个形状为dims并且以value数据填充的张量

6.tf.constant(value,detype,shape,name)创建一个常数张量

7.tf.truncated_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)创建一个从截断的正太分布中输出随机值的形状为shape的张量,且数据不会超过标准差

8.tf.random_norma(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)创建一个正太分布的随机值的张量

4.张量的变换

1.类型改变

 2.形状改变

张量具有两种形状改变,动态形状和静态形状

tf.reshape

tf.set_shape

静态形状转变:1阶转到1阶,2阶转到2阶,不能跨阶转变形状。对于已经固定的张量的静态性状,不能在设置静态形状。

动态形状:动态创建新张量时,张量的元素个数必须匹配

八.变量OP

1.创建变量

tf.Variable(initial_value=None,trainable=True,collections=None,name=None)

initial_value:初始化值

trainable:是否被训练

collections:将新变量将添加到列出的图的集合中collections,默认为[GraphKeys.GLOBAL_VARIABLES],如果trainable是True变量也被添加到图行集合GraphKeys.TRAINABLE_VARIABLES

变量需要显示初始化才能运行值

def variable_demo():
    # 定义变量
    a=tf.Variable(initial_value=30)
    b=tf.Variable(initial_value=40)
    sum=tf.add(a,b)

    # 初始化变量
    init=tf.global_variables_initializer()
    
    # 开启会话(tensorflow1版本)
    with tf.Session() as sess:
        # 运行变量初始化
        sess.run(init)
        print(sess.run(sum))
    return None

总结:

(1)构建一个计算图。图中的节点可以是TensorFlow支持的任何数学操作。
(2)初始化变量。将前期定义的变量赋初值。
(3)创建一个会话。这才是图计算开始的地方,也是体现它“惰性”的地方,也就是说,仅仅构建一个图,这些图不会自动执行计算操作,而是还要显式提交到一个会话去执行,也就是说,它的执行,是滞后的。
(4)在会话中运行图的计算。把编译通过的合法计算流图传递给会话,这时张量(tensor)才真正“流动(flow)”起来。
(5)关闭会话。当整个图无需再计算时,则关闭会话,以回收系统资源。

 都看到这里了,点个赞吧!!!!!

 

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

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

相关文章

【编程基础C++】素数判定、最小公倍数与最大公因数的实现方法

文章目录 素数法一法二 最大公因数辗转相除法另一写法 最小公倍数直接枚举法根据GCD算LCM 素数 素数 是指大于1的自然数&#xff0c;且只能被1和自身整除。例如&#xff0c;2、3、5和7都是素数。它们在数学中非常重要&#xff0c;因为任何大于1的自然数都可以唯一地表示为素数…

【类模板】成员函数模板

一、成员函数模板的基本含义 不管是普通的类&#xff0c;还是类模板&#xff0c;都可以为其定义成员函数模板&#xff0c;以下的情况就是类模板和成员函数模板都有各自独立的一套参数&#xff1a; template<typename T1> class A { public:T1 m_ic;static constexpr int…

电力104规约

对象性质十进制十六进制数量适用报文类型ASDU遥测1793~2304701H~900H512*9、11、21、34、35遥信1~10241H~400H1024*1、3、20、30、31遥控2817~2944B01H~B80H128*45、46遥调2945~3072B81H~C00 H128*47APCI 应用规约控制信息; ASDU 应用服务数据单元; APDU 应用规约数据单元;…

CountDownLatch的应用与原理

一、什么是CountDownLatch CountDownLatch是具有synchronized机制的一个工具&#xff0c;目的是让一个或者多个线程等待&#xff0c;直到其他线程的一系列操作完成。 CountDownLatch初始化的时候&#xff0c;需要提供一个整形数字&#xff0c;数字代表着线程需要调用countDow…

K8s系列之:解释Kubernetes Operators

K8s系列之&#xff1a;解释Kubernetes Operators 什么是控制器循环&#xff1f;Kubernetes Operator是如何工作的&#xff1f;如何添加自定义资源自定义资源定义Kubernetes Operators&#xff1a;案例研究 你是否曾想过&#xff0c;Site Reliability Engineering&#xff08;SR…

【优化】Nginx 配置页面请求不走缓存 浏览器页面禁用缓存

【优化】Nginx 配置页面请求不走缓存 禁用缓存 目录 【优化】Nginx 配置页面请求不走缓存 禁用缓存 对所有请求禁用缓存 对特定location禁用缓存 注意事项 全局禁用缓存 要配置Nginx使其不缓存内容&#xff0c;通常是指禁止浏览器缓存响应的内容&#xff0c;或者是在代理…

Qt 模仿企业微信图标实现按钮图片文字上下结构

简述 实现类似企业微信左侧导航栏的上下结构的按钮 效果图 可以用2种方案实现&#xff0c;2种最终效果图如下&#xff1a; 方案1 QToolButton 实现 ui.toolButton->setFixedSize(50, 50);ui.toolButton->setCheckable(true);ui.toolButton->setAutoExclusive(true);…

电源测试设备功能篇:测试仪器的灵活兼容与扩展

依托ATECLOUD智能云测试平台打造的电源ate自动测试设备&#xff0c;相较于传统的自动化测试系统&#xff0c;其突出特点在于提供了灵活的系统操作。这种操作灵活性不仅表现在自动化测试的便捷性、报告模板的多样化以及数据分析的灵活性上&#xff0c;还表现在电源测试仪器设备配…

覃嘉仪,艺人经纪人、经纪人、影视经纪人。2002.7.9出生于四川省遂宁市射洪县

覃嘉仪&#xff0c;艺人经纪人、经纪人、影视经纪人。2002.7.9出生于四川省遂宁市射洪县 2020年开始从事宣传工作&#xff0c;2023成为“WP经纪工作室”艺人经纪&#xff0c;现担任孙亦欣、魏逸熙等艺人的经纪人。 2024年涉足于影视行业&#xff0c;并加入嘉林娱乐。2024年在由…

部标JT808标准下的视频汇聚新方案:EasyCVR平台助力推动车辆监管智能化进程

在数字化转型的浪潮中&#xff0c;智慧城市的建设正以前所未有的速度推进&#xff0c;而市政车载设备作为城市运行的重要“神经末梢”&#xff0c;其智能化、联网化水平直接影响着城市管理效率与服务质量。近年来&#xff0c;随着部标协议&#xff08;即国家行业标准协议&#…

Python学习日志(3)—— 运行

通过python文档辅助学习&#xff0c;规范代码 python文档&#xff1a;3.12.5 Documentation (python.org) 1、python版本之间的差异&#xff1a;新的特性和变化、弃用和新增 2、标准库参考&#xff08;宝典&#xff0c;用于查询&#xff09; 3、语法参考 python程序是解释型…

记录工作时的一些错误

1、mobaxterm问题&#xff1a; 解决方案&#xff1a;找不到mottynew.exe 2、虚拟机安装centos7进入不了引导页面 解决方案&#xff1a;检查镜像 虚拟机 192.168.40.128 root/Root yxr/y123x123r123 解决方案&#xff1a; 问题&#xff1a;docker run不起来容器&#xff0c;显…

HTTP 状态码全攻略:快速搞懂服务器的“暗号”

文章目录 HTTP 状态码全攻略&#xff1a;快速搞懂服务器的“暗号”1xx&#xff1a;打个招呼&#xff0c;信息来了 (Informational Responses)2xx&#xff1a;事情办成了&#xff01; (Successful Responses)3xx&#xff1a;走这边&#xff0c;换个地方吧 (Redirection Response…

音视频——RTSP流媒体传输技术介绍及抓包解析

流式传输 流媒体技术&#xff1a;将声音影像向用户计算机 连续、不间断的进行传送&#xff0c;延时小。 抓包 route add 添加到指定网络的路由规则 route add [-net|-host] [网域或主机] netmask [mask] [gw|dev] route del [-net|-host] [网域或主机] netmask [mask] [gw|dev…

第9章 使用ContentProvider实现数据共享

第9章 使用ContentProvider实现数据共享 本章要点 理解ContentProvider的功能与意义ContentProvider类的作用和常用方法Uri 对 ContentProvider的作用理解ContentProvider与ContentResolver的关系实现自己的ContentProvider配置ContentProvider使用ContentResolver操作数据操…

宝藏!《联盟自控基础班筑基题库》(凤凰篇) 1-8章:甄选部分

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;初试《自控基础班筑基题库》(凤凰篇)。 Part1&#xff1a;资料封面&目录 Part2&#xff1a;资料各个章节具体内容 第1章 自动控制的基本概念 第2章 控制系统的数学模型 第3章 控制系统的时域分析 第4章 根轨迹法…

某东东的jdgs算法分析--适合进阶学习

某东东的jdgs算法分析 这个贴主要还是对算法本身结构部分描述会多点&#xff0c;憋问&#xff0c;问就是过去太久了&#xff0c;很多逆向过程不一定能还原&#xff08;主要是懒&#xff0c;不想原路再走一遍&#xff09;&#xff0c;所以可能有部分跳跃的内容&#xff0c;会给具…

【网络安全】IDOR之敏感数据泄露

未经许可,不得转载。 文章目录 正文正文 在测试“添加到收藏夹”功能时,我拦截了发送到服务器的请求,请求体如下: {“uriTemplate”:“asset/{assetId}/favorite”,“version”:“v2”,“type”:“POST”,“req_service”:“pict”,“url”:“asset/VICTIMS_ASS…

【论文阅读】DivTheft: An Ensemble Model Stealing Attack by Divide-and-Conquer(2023)

摘要 Recently, model stealing attacks(模型窃取攻击) are widely studied(广泛研究) but most of them are focused on stealing a single non-discrete model(窃取单个非离散模型), e.g., neural networks(神经网络). For ensemble models(对于集成模型), these …

分钟快速搭建分班查询系统,支持查班级群二维码

新学期已经开始了&#xff0c;老师们又要忙活起来了。但是&#xff0c;别担心&#xff0c;现在有个超方便的工具&#xff0c;能帮大家快速搞定分班的事情&#xff0c;还能让家长们一键加入班级群&#xff0c;省时又省力&#xff01; 以前分班可麻烦了&#xff0c;老师们得一个…