[1] 从零开始 TensorFlow 学习

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>

© 版权声明
THE END
喜欢就支持一下吧
点赞13赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容