TensorFlow基础知识
-
TensorFlow
数据流图介绍-
TensorFlow
数据流图是一种声明式编程范式。声明式编程与命令式编程的多角度对比
编程范式 核心思想 程序抽象 计算过程 计算单元 擅长领域 实现方法 声明式编程 要什么 数学模型 表达式变换 函数 数理逻辑 结构化、抽象化 命令式编程 怎么做 有穷自动机 状态转换 指令 业务逻辑 过程化、具体化 -
TensorFlow
数据流图TensorFlow
数据流图的优势:- 并行计算快(利用可执行队列和拓扑排序的思想)
- 分布式计算快(CPUs, GPUs, TPUs)
- 预编译优化(XLA)
- 可移植性好
-
-
张量(
Tensor
)是什么-
张量表示某种相同数据类型的多维数组。
-
张量是用来表示多维数据的;张量是执行操作时的输入或输出数据;用户通过执行操作来创建或计算张量;张量的形状不一定在编译时确定,可以在运行时通过形状推断计算得出。
-
在
TensorFlow
中,有几类比较特别的张量,由以下操作产生:tf.constant # 常量 tf.placeholder # 占位符 tf.Variable # 变量
-
-
变量(
Variable
)是什么-
TensorFlow
变量(Variable
)的主要作用是维护特定节点的状态,如深度学习或机器学习的模型参数。 -
tf.Variable
方法是操作,返回值的变量(特殊张量)。通过
tf.Variable
方法创建的变量,与张量一样,可以作为操作的输入与输出。不同之处在于:- 张量的生命周期通常随依赖的计算完成而结束,内存也随机释放。
- 变量则常驻内存,在每一步训练时不断更新其值,以实现模型参数的更新。
-
TensorFlow
变量使用流程
-
-
操作(
Operation
)是什么TensorFlow
用数据流图表示算法模型。数据流图由节点和有向边组成,每个节点均对应一个具体的操作。因此,操作是模型功能的实际载体。- 数据流图中的节点按照功能不同可以分为3种:
- 存储节点:有状态的变量操作,通常用来存储模型参数;
- 计算节点:无状态的计算或控制操作,主要负责计算逻辑表达或流程控制;
- 数据节点:数据的占位符操作,用于描述图外输入数据的属性。
- 注:操作的输入和输出是张量或操作(函数式 编程)
TensorFlow
使用占位符操作表示图外输入的数据,如训练和测试数据。
-
会话(
Session
)是什么-
会话提供了估算张量和执行操作的运行环境,它是发放计算任务的客户端,所有计算任务都由它连接的执行引擎完成。一个会话的典型使用流程分为以下3步:
sess = tf.Session(target=...,graph=...,config=...) # 1.创建会话 sess.run(...) # 2.估算张量或执行操作 sess.close() # 3.关闭会话
参数名称 功能说明 target 会话连接的执行引擎 graph 会话加载的数据流图 config 会话启动时的配置项 -
获取张量值的另外两种方法:估算张量(Tensor.eval)与执行操作(Operation.run)
import tensorflow as tf x = tf.placeholder(tf.float32) W = tf.Variable(1.0) b = tf.Variable(1.0) y = W * x + b with tf.Session() as sess: tf.global_variables_initializer().run() # Operation.run fetch = y.eval(feed_dict={x:3.0}) # Tensor.eval print(fetch)
-
TensorFlow
会话执行原理当我们调用
sess.run(op)
语句执行训练操作时:- 首先,程序内部提取操作依赖的所有前置操作。这些操作的节点共同组成一幅子图;
- 然后,程序会将子图中的计算节点、存储节点和数据节点按照各自的执行设备分类,相同设备上的节点组成了一幅局部图;
- 最后,每个设备上的局部图在实际执行时,根据节点间的依赖关系将各个节点有序地加载到设备上执行。
-
TensorFlow
会话本地执行对于单机程序来说,相同机器上不同编号的CPU或GPU就是不同的设备,我们可以在创建节点时指定执行该节点的设备。
# 在0号CPU执行的存储节点 with tf.device("/cpu:0"): v = tf.Variable(...) # 在0号GPU执行的计算节点 with tf.device("/gpu:0"): z = tf.matmul(x, y)
-