TensorFlow1和TensorFlow2介绍

目录

一.安装

二.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程序通常被组织成一个构建图阶段和一个执行图阶段。在构建图阶段,数据于操作的执行步骤被描述成一个图。在执行阶段,使用会话执行构建好的图中的操作。

python 复制代码
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)

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

python 复制代码
# 关闭警告
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()访问,

python 复制代码
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.自定义图

python 复制代码
new_graph=tf.Graph()
print(new_graph)

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

python 复制代码
with tf.Session(graph=new_graph) as sess:
    print(sess.run(c))

四.TensorBoard:可视化

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

1.数据序列化-events文件

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

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

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

2.启动TensorBoard

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

python 复制代码
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就可以了。

构建一个模型来测试以下

python 复制代码
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写入训练模型过程了

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

python 复制代码
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类创建一个与之对应的对象

python 复制代码
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指定参数

python 复制代码
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阶

python 复制代码
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

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

python 复制代码
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)关闭会话。当整个图无需再计算时,则关闭会话,以回收系统资源。

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

相关推荐
Mr.简锋4 分钟前
opencv常用api
人工智能·opencv·计算机视觉
DevinLGT33 分钟前
6Pin Type-C Pin脚定义:【图文讲解】
人工智能·单片机·嵌入式硬件
宋一诺3337 分钟前
机器学习—高级优化方法
人工智能·机器学习
feifeikon38 分钟前
Python Day5 进阶语法(列表表达式/三元/断言/with-as/异常捕获/字符串方法/lambda函数
开发语言·python
龙的爹23331 小时前
论文 | The Capacity for Moral Self-Correction in LargeLanguage Models
人工智能·深度学习·机器学习·语言模型·自然语言处理·prompt
Mr.简锋1 小时前
opencv视频读写
人工智能·opencv·音视频
Baihai_IDP1 小时前
「混合专家模型」可视化指南:A Visual Guide to MoE
人工智能·llm·aigc
杰仔正在努力1 小时前
python成长技能之枚举类
开发语言·python
Eiceblue1 小时前
通过Python 调整Excel行高、列宽
开发语言·vscode·python·pycharm·excel
寰宇视讯1 小时前
“津彩嘉年,洽通天下” 2024中国天津投资贸易洽谈会火热启动 首届津彩生活嘉年华重磅来袭!
大数据·人工智能·生活