Tensorflow基础概念
tensorflow与theano、caffe一样使用基于声明式编程的数据流图作为编程范式。
声明式编程与命令式编程比较
编程范式 | 核心思想 | 实现方法 | 程序抽象 | 计算过程 | 计算单元 | 变量意义 | 擅长领域 | 典型应用 |
---|---|---|---|---|---|---|---|---|
声明式编程 | 做什么 | 结构化、抽象化 | 数学模型 | 表达式变换 | 函数 | 抽象符号 | 数理逻辑 | 深度学习 |
命令式编程 | 怎么做 | 过程化、具体化 | 有穷自动机 | 状态转换 | 命令 | 存储单元 | 业务逻辑 | 交互式UI程序 |
声明式编程在深度学习应用上的优势
- 代码可读性强
它以目标而非过程导向,更接近于数据公式或者人类思维方式
通过斐波那契数列计算为例:
命令式编程
def fib(n):
a,b = 1,1
for i in range(1,n):
a, b = b, a+b
return a
声明式编程
fib = lambda x:1 if x <= 2 else fib(x - 1) + fib(x - 2)
虽然涉及了函数递归调用,性能较差,但对于专门为函数式编程设计的开发库和运行时环境,一般都会有多重变异优化机制来处理递归展开等问题
- 支持引用透明
引用透明:一个函数的语义同它出现在程序的上下文无关,则称它是引用透明的。
对于用于表达算法的函数,引用透明的一个推论是函数的调用语句可以被它的返回值取代,而不影响程序语义,与上下文无关
在神经网络中,用户创建的模型是一个数据流图,图的拓扑结构由函数的组合关系定义,我们可以执行任意函数组合,得到不同模型结构的输出 - 提供预编译优化能力
运行时环境不像解释型命令式语言即刻执行代码,而是类似于编译型命令式语言的语法数生成过程,需要事先便已得到完整的数据流图,根据用户选择的子图,输入数据进行计算。
Tensorflow数据流图的基本概念
Tensorflow数据流图定义:用节点和有向边描述数学运算的有向无环图。
1、节点
前向图中包括数学函数或表达式、存储模型参数的变量、占位符
后向图中包括梯度值、更新参数的操作、更新后的模型参数
2、有向边
两类:一类是数据边,用来传输数据;一类是控制边,用来定义控制依赖,通过设定节点的前置依赖决定相关节点的执行顺序。
3、执行原理
各个节点的执行顺序并不完全依赖于代码中定义的顺序,而是与节点之间的逻辑关系以及运行时库的实现机制相关。