文章目录
- 一、接前一天
- 二、计算图或数据流图
- 1. 什么是计算图或者数据流图
- 2. 为什么需要计算图或者数据流图
- 3. 执行顺序和延迟加载在tf中的使用
一、接前一天
这几天主要学习了张量的创建方法
,以及变量
,变量命名域共享变量等概念
。今天主要熟悉 数据流图或者计算图的概念
二、计算图或数据流图
1. 什么是计算图或者数据流图
(1)
. 计算图是tf
的基本计算单位之一
,与张量一样都是基本的计算单位。
(2)
. tensorflow1中的数据流图
,也被称为计算图
,是一种用于表示机器学习模型
的抽象概念。它由节点(Nodes)
和边(Edges)
组成,其中节点代表操作或变量
,边
表示它们之间的依赖关系
。
当我们定义了一个tensorflow1
的计算图后,我们可以使用tensorflow提供的Session对象
对其进行计算。Session会将计算图中依赖关系解析出来
,实现节点之间的数据流动
,并最终生成输出结果。
在计算图中,每个节点
可以接受零个或多个输入
,并产生零个或多个输出
。每个输出
都可以被视为一个张量(tensor)
,因此tensorflow的名字也正是由此而来。
通过这种方式,tensorflow将复杂的计算过程抽象成为一个图形结构,使得我们可以更加直观地理解模型的结构和逻辑,方便进行优化和调试。
例如:定义一个 加法
节点
表示操作(包括变量的创建、张量的数学运算、卷积操作等)
,边
表示操作之间的依赖关系
。这里就是说在执行输出y之前需要执行 输入阶段和add节点。
节点
可以接收零个或多个输入
,产生零个或多个输出
,每个输出又可以被视为一个tensor(张量)
。在tensorflow中,张量是一种具有特定形状(shape)
和数据类型(dtype)
的多维数组
,可以用来存储数据。
(3)
. 计算图上有两种操作
- 构建计算图
创建api:
graph = tf.get_default_graph()
- 运算计算图
使用tensorflow
提供的Session对象
对其进行计算
2. 为什么需要计算图或者数据流图
-
可以高效地计算模型的前向传递和反向传播
:TensorFlow使用数据流图来表示计算模型,它可以自动地计算模型的前向传递和反向传播。数据流图将计算过程划分为一系列节点(Nodes)和边缘(Edges),每个节点代表一个操作或函数,而边缘则表示节点间的依赖关系。TensorFlow可以通过在数据流图中进行迭代、优化和求导等操作,高效地计算模型的输出值和梯度。 -
可以实现延迟加载和分布式计算
:TensorFlow支持延迟加载机制,这意味着它只有在需要时才会计算节点的值,而不是在图构建阶段就立即计算。这种机制可以降低内存占用和计算量,提高计算效率和灵活性,并且允许动态调整计算图结构和参数。同时,数据流图还可以方便地实现分布式计算,从而充分利用多台机器的计算资源,加速计算过程。 -
可以轻松地构建复杂的计算模型
:TensorFlow提供了丰富的API,可以帮助用户轻松地构建各种复杂的计算模型,包括神经网络、卷积神经网络、循环神经网络等。通过在数据流图中添加不同类型的节点和边缘,用户可以描述具有各种功能和性能的计算模型,并利用TensorFlow高效地训练和优化这些模型。
例如
:
import tensorflow as tf
# 定义两个向量
a = tf.constant([1.0, 2.0, 3.0], name="a")
b = tf.constant([4.0, 5.0, 6.0], name="b")
# 定义向量加法操作
c = tf.add(a, b, name="add")
# 创建Session并执行图上的操作
sess = tf.Session()
result = sess.run(c)
print(result)
# 关闭Session
sess.close()
在这行代码中,我创建两个常量,并执行add操作。因为没有使用with模块,因此最后需要 .close()
操作.
注意
:
TensorFlow会自动创建默认的数据流图
,用户不需要显式的使用graph = tf.get_default_graph()
创建。用户使用tf中的操作时候,都会自动添加到默认的计算图中。但是在多图中
就要进行显式的创建
。
使用附带with
模块的不需要.close()
操作。
import tensorflow as tf
#y = wx + b
w = tf.Variable([0.3],dtype=tf.float32)
b = tf.Variable([-3],dtype=tf.float32)
x = tf.placeholder(tf.float32)
y = w*x + b
out = 0
with tf.Session() as sess:
tf.global_variables_initializer().run()
out = sess.run(y,{x:[1,2,3,4]})
print('out:',out)
3. 执行顺序和延迟加载在tf中的使用
-
执行顺序
:在计算图中,每个节点代表了一个计算操作或函数,并且它们之间通过边连接来表示数据依赖关系。当计算图被执行时,节点将按照它们的输入
和输出
以及边的顺序进行计算
,并将它们的结果传递给它们所连接的节点
。因此,计算图中的执行顺序通常是确定
的,且与节点的位置
、形状
或颜色
等外部特征无关
。 -
延迟加载
:有些计算图框架支持延迟加载机制
,即只有在需要时才计算节点的值,而不是在图构建阶段就立即计算。这种机制可以降低内存占用
和计算量
,提高计算效率
和灵活性
,并且允许动态调整计算图结构和参数。具体来说,当我们使用计算图框架构建模型时,只需要定义节点之间的依赖关系和计算规则,而不需要显式地指定每个节点的值。然后,当我们需要计算某个节点的值时,框架会自动递归地计算该节点所依赖的所有节点,并返回最终结果。这种机制类似于Python中的惰性求值(lazy evaluation)
,可以大大简化编程和调试过程。
例如:
我们想要控制图中节点的执行顺序,可以通过tf.Graph.control_dependencises()
函数来实现:
比如:计算节点a,b,c,d希望在执行a
和b
之前执行c
和d
。
with graph_variable.control_dependcies([c,d]):
pass