博客已迁至知乎,本文链接:https://zhuanlan.zhihu.com/p/70877190
前言
本文梳理了TensorFlow的基本概念:数据流图、Tensor、Operation、Variable、Placeholder、Session、Optimizer、minimize。并对每个概念进行了详细的讲解和扩展。
阅读本文需要对深度学习有一定了解,并知道tensorflow是做什么的。
一. 编程范式:数据流图
声明式编程和命令式编程:
声明式编程:做什么
命令式编程:怎么做
TensorFlow采用了声明式编程范式。
声明式编程的优点:
1.代码可读性强:以目标而非过程为导向。
2.支持引用透明:函数的调用语句可以由它的返回值取代。
3.提供预编译优化能力:先构建出数据流图,无依赖逻辑的并行化计算、无效逻辑去除、公共逻辑提取等。
tensorflow数据流图:
数据流图定义:用节点和有向边描述数学运算的有向无环图。
数据流图中的节点代表各类操作,包括数学运算、数据填充、结果输出和变量读写等等,每个节点的操作都需要分配到具体的物理设备(cpu、gpu)上执行。有向边描述了节点间的输入输出关系。
1.节点
前向图中的节点有:
- 数学函数或表达式
- 存储模型参数的变量(variable)
- 占位符(placeholder)
后向图中的节点有:
- 梯度值
- 更新模型参数的操作
- 更新后的模型参数
2.有向边
多数用来传输数据,少数用来控制依赖。
3.执行原理
数据流图执行顺序的实现参考了拓扑排序的设计思想。
当我们使用tensorflow执行指定数据流图时,其执行过程可分为以下4个步骤:
- a.以节点名称作为关键字,其所依赖的个数为值,创建一个散列表,将所有节点放入这个散列表。
- b.为此数据流图创建一个可执行队列,将三列表中依赖个数为0的节点加入队列,并在散列表中删除它们。
- c.一次执行队列中的每个一节点,执行成功后将此节点输出项的节点的依赖数减1,更新散列表。
- d.重复b和c,直到执行队列为空。
二. 数据载体:张量
在tensorflow中,张量(Tensor)是数据流图上的数据载体,通常是多维数组。还有一种叫SpareseTensor,存放稀疏数据(0的数量远多于非0元素),旨在减少稀疏数据的内存占用。
在物理实现时,它含有指向张量数据的内存缓冲区的指针,当它不被任何操作依赖时,会释放该内存缓冲区。
1.创建
一般tensor都不是直接创建的,而是定义常量和代数计算操作而间接创建的。
import tensorflow as tf
a = tf.constant(1, name="a", dtype=tf.int32)
b = tf.constant(2, name="b", dtype=tf.int32)
c = tf.add(a, b, name="c")
print(a)
print(b)
print(c)
Tensor("a:0", shape=(), dtype=int32)
Tensor("b:0", shape=(), dtype=int32)
Tensor("c:0", shape=(), dtype=int32)
2.求解
如果想要求解某个张量的值,则需要创建会话,然后执行张量的eval方法或会话的run方法。
with tf.Session()