2022-03-04
计算图的基本概念
这个名字已经解释了它的两个最重要的概念——流和流
:张量(高阶数组,矩阵为二阶张量,向量为一阶张量,标量为零阶张量)
Flow:流量张量数据(形状可以像水的流动变化)
所以它是一个编程系统,先构造一个图,然后用张量流的形式表达计算
图中每次计算都是一个Nodes,简称op
节点之间的边描述了计算之间的依赖关系
左图是基本计算图
如果一个操作的输入依赖于另一个操作的输出,那么这两个操作是相互依赖的。
a和b这两个常数不依赖任何其他计算,而add计算则依赖于读取这两个常数的值
计算图的使用
程序可以分为A和B两个阶段
通过默认tf将定义的计算转化为计算图。
A阶段:定义计算图中的所有计算()
import tensorflow as tf
a = tf.constant([1.0,2.0],name='aa')
b = tf.constant([2.0,3.333],name="bb")
result = a + b
B阶段:执行计算图()
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(result))
通过tf.Graph函数生成新的计算图(独立不共享)
A阶段:定义计算图中的所有计算()
import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
# v = tf.get_variable("v",initializer=tf.zeros_initializer(shape=[1])) # 该写法已经废弃
# 在计算图 g1 中定义变量“v”,并设置初始值为0的2*2的Tensor
v = tf.get_variable("v1",shape=[2,2],initializer=tf.zeros_initializer)
g2 = tf.Graph()
with g2.as_default():
# 在计算图 g2 中定义变量“v”,并设置初始值为1的2*2的Tensor
v = tf.get_variable("v2",shape=[2,2],initializer=tf.ones_initializer)
阶段 B:执行计算图()
# 在计算图g1中读取变量"v"的取值.
with tf.Session(graph=g1) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("",reuse=True):
print(sess.run(tf.get_variable("v1")))
# 在计算图g2中读取变量"v"的取值.
with tf.Session(graph=g2) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("",reuse=True):
print(sess.run(tf.get_variable("v2")))
计算图
提供了一种管理张量和计算的机制。计算图可以通过 tf.Graph 访问。函数来指定运行计算的设备,它提供了使用特定设备(GPU、TPU)的入口。
以下是选择计算设备的具体演示:
import tensorflow as tf
g = tf.Graph()
a = tf.constant([1,2,3],name="aaa")
b = tf.constant([3,2,1],name="bbb")
# 指定计算运行的设备
with g.device ('/gpu:0'):
result = a + b
@ >
在计算图中,可以通过()来管理不同类型的资源(变量)。
例如,tf.函数可以将变量添加到一个或多个集合中
然后使用 tf.获取集合中的所有资源。这里的资源可以是张量、变量,也可以是运行程序所需的队列资源
tf.add_n:依次添加set()中的所有内容
import tensorflow as tf
v1 = tf.get_variable(name='v1', shape=[1], initializer=tf.constant_initializer(1))
tf.add_to_collection('loss', v1)
v2 = tf.get_variable(name='v2', shape=[1], initializer=tf.constant_initializer(2))
tf.add_to_collection('loss', v2)
collection_sum = tf.add_n(tf.get_collection('loss')) # 累加collection
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print (tf.get_collection('loss'))
print (sess.run(collection_sum))
"""
输出:
[, ]
[3.]
"""
@ >
数据模型:张量
中张量的实现并不是直接以数组的形式,而是对运算结果的引用,并没有真正保存在张量中的中,它保存了如何获取这些数字的计算.
张量加法是实际实验
import tensorflow as tf
# tf.constant 是一个计算,这个计算结果为一个张量,保存在变量a中
a = tf.constant([[1.2,2.4],
[2.4,3.6]],name="a")
b = tf.constant([[3.3,4.4],
[4.4,5.5]],name="b")
result = tf.add(a,b,name="add")
print (result)
"""
输出:
Tensor("add:0", shape=(2, 2), dtype=float32)
"""
从上面的代码可以看出,NumPy 中的张量与 NumPy 中的数组是不同的。计算的结果不是一个具体的数字,而是一个张量的结构。
一个张量主要保存三个属性:名称(name)、维度(shape)和数据类型(dtype)
并且张量的第一个属性名不仅是张量的唯一标识,它以“node:”的形式给出。其中node为节点的名称,如上面代码中键入的“add”,表示当前张量从节点的输出。 “添加:0”
表示这个张量是一个计算节点“加法”输出第一个结果(编号从0开始)。
运行模型会话()
会话在程序运行时拥有并管理所有资源(变量)。 all 计算完成后,需要关闭,帮助系统回收资源,否则可能会出现资源泄漏的问题。
推荐做法:
# 创建一个会话,并通过 Python 中的上下文管理器来管理这个会话
with tf.Session() as sess:
# 使用创建好的会话来计算关心的结果
sess.run( ... )
# 不需要再调用“Session.close()”函数来关闭会话
# 当上下文退出时会话关闭和资源释放也自动完成了
# 上下文管理器的机制: 只要将所有的计算放在 “with”的内部就可以
如前所述,计算图没有特殊的指定,会自动生成一个默认的计算图供计算使用。中的会话。指定后,可以通过 tf..eval 函数计算张量的值。
import tensorflow as tf
# tf.constant 是一个计算,这个计算结果为一个张量,保存在变量a中
a = tf.constant([[1.2,2.4],
[2.4,3.6]],name="a")
b = tf.constant([[3.3,4.4],
[4.4,5.5]],name="b")
result = tf.add(a,b,name="add")
sess = tf.Session()
with sess.as_default():
print(result.eval())
# 以下代码可以完成相同的功能
sess = tf.Session()
print(sess.run(result))
print(result.eval(session=sess))
sess.close()
通过配置要生成的,下面是通过配置方法:
config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
sess1 = tf.Session(config=config)
还可以配置并行线程数、GPU分配策略、操作超时等参数。
最常用的有两种:
第一个是,这是一个bool类型的参数,这使得代码高度可移植(有或没有GPU)
这个参数的默认值为False。为True时,只要满足以下任一条件,即可在CPU上进行GPU上的操作:
1.无法在GPU上执行操作
2. 没有 GPU 资源(即操作被指定在第二个 GPU 上运行,但机器只有一个 GPU)
3.运算输入包含对CPU计算结果的引用
第二个使用较多的配置参数也是bool类型的参数。为True时,日志会记录每个节点被安排在哪个设备上。方便调试。生产环境将此参数设置为False,可以减少日志量。
分类:
技术要点:
相关文章:
p>
暂无评论内容