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

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

相关推荐
-一杯为品-1 分钟前
【深度学习】#9 现代循环神经网络
人工智能·rnn·深度学习
硅谷秋水4 分钟前
ORION:通过视觉-语言指令动作生成的一个整体端到端自动驾驶框架
人工智能·深度学习·机器学习·计算机视觉·语言模型·自动驾驶
Java中文社群26 分钟前
最火向量数据库Milvus安装使用一条龙!
java·人工智能·后端
豆芽81934 分钟前
强化学习(Reinforcement Learning, RL)和深度学习(Deep Learning, DL)
人工智能·深度学习·机器学习·强化学习
山北雨夜漫步40 分钟前
机器学习 Day14 XGboost(极端梯度提升树)算法
人工智能·算法·机器学习
basketball61641 分钟前
Python torchvision.transforms 下常用图像处理方法
开发语言·图像处理·python
兔子蟹子1 小时前
Java集合框架解析
java·windows·python
宁酱醇1 小时前
各种各样的bug合集
开发语言·笔记·python·gitlab·bug
yzx9910131 小时前
集成学习实际案例
人工智能·机器学习·集成学习
CodeJourney.1 小时前
DeepSeek与WPS的动态数据可视化图表构建
数据库·人工智能·信息可视化