Eager Execution
目前使用TensorFlow时,需要编写一个Python程序,首先构建一个表示计算的图,然后调用Session.run()将这个计算图交给C++运行库执行,从这个意义上说,Tensorflow提供了一个声明式编程模型,其计算图的构建和实际的执行是分离的。
计算图的优点
TensorFlow从某种意义上说是一种编程语言和一种用于机器学习模型的编译器,其将机器学习模型作为输入,编码成一个名为Graph的低级表示,然后将其重写为优化的可执行形式,沿途使用类似编译器的优化。这种模式有许多好处:
1、优化可以减少训练模型或运行推理的挂钟时间和内存占用时间
2、计算图作为平台不可知的中间表示,简化了部署。
3、重写图形的能力使得我们可以尝试像自动设备放置和重量量化这样的策略。
优化的
自动缓冲区重用
不断折叠
操作间并行性
计算和内存之间的自动权衡
可部署
图就是模型的中间表示
可重写
尝试自动设备放置或 量化
计算图的缺点
尽管计算图的表示方法有很多优点,但是其缺点也不小。声明式范例导致难以调试的程序,因为在构建计算图之后会报告错误。而且由于计算图执行是由Session管理的,所以不能够使用pdb甚至是打印语句来调试模型。构建图形就像使用汇编语言进行编码-原则上我们可以使用计算图来实现我们所需要的任何机器学习模型,但是这样做可能比较困难。编写一个TensorFlow程序是元编程的一个练习: 使用Python用TensorFlow图形语言编写程序。因此,我们不能使用本地Python控制流结构,而必须依赖它们在TensorFlow中的等价物。而且,不能轻易地将图形构造与自定义数据混合在一起,我们可能想要使用Python类来表示结构化数据,但是无法传递类,无法沿着图的边缘流动。总结下来就是如下缺点:
难以调试
计算图构建之后会报告错误
执行不能用pdb或者打印语句来调试
Un-Pythonic
编写一个Tensorflow程序是元编程的练习
控制流(如 tf.while_loop)与Python不同
不能轻松地将计算图构建与自定义数据结构混合
Eager Execution
我们可以直接从Python执行TensorFlow操作吗?实际上,我们不能将任何给定的计算图打破到它的组件操作并直接从Python中调用它们。
Eager Execution是用于计算的类Numpy库,支持GPU加速和自动分化,以及灵活的机器学习研究和实验平台。
使用Eager的例子:
Eager Execution的优点
与Python调试工具兼容
提供即时的错误报告
允许使用Python数据结构
例如用于结构化输入。
启用Pythonic控制流程
Eager Execution可以简化代码
我们不再需要担心以下这些问题:
1、placeholders
下面是一个程序,它将一个矩阵与自身相乘。我们首先用一个占位符定义一个计算图,并将矩阵提供给平方。
而如果使用了Eager Execution,下面三行代码提供了相同的效果。没有Session,没有placeholder和matmul操作,立即得出运算结果。
2、sessions
3、control dependencies
4、”lazy loading”
Eager Execution还有利于避免元编程的一些缺点。例如,以下的代码就是在程序中间快速破解分析Tensor X的代码。循环的每一次迭代都是将操作添加到计算图的内存中表示。在这种情况下,每次调用session.run()都会执行random_uniform操作,所以这里的代码片段并没有打印Tensor的一致快照。
而当在Eager Execution的情况下,没有一个计算图的概念或者一个操作的重复执行,所以最明显的做法是很好的。
5、{name, variable, op} scopes
Tensors和NumPy数组的行为相似
|
|
梯度
自动梯度求解已经加入到eager execution中。当启用eager execution时,执行的操作将在一个”tape”中进行追踪,以回放计算梯度。如果熟悉autograd包的话,这个API非常相似。
|
|
即便eager execution没被允许,计算梯度的API依然有效。
tfe.gradients_function()
tfe.value_and_gradients_function()
tfe.implicit_gradients()
tfe.implicit_value_and_gradients()
详情可参考:
eager execution document
Linear Regression in Eager
A Collection of Operations
TensorFlow = Operation Kernels + Execution
Graph construction: 使用Session来执行操作的组合
Eager execution: 用Python执行操作的组合。
观察TensorFlow的一种方式是作为一系列操作:数学,线性代数,图像处理,Tensorboard可视化的总结生成等以及执行构成它们的计算的手段。Session提供了一种方法来执行这些操作,在执行的时候,Python是执行组合的方法,但是底层的操作保持不变,结果,API表面的大部分也保持不变。
不管eager execution是否被允许,大多数TensorFlow API都可以工作,但是当eager exectution允许时,有一些特殊情况需要注意:
1、在eager execution模式下最好使用tfe.Variable
2、管理好自己的变量存储,变量集合是不被允许的。
3、使用 tf.contrib.summary
4、使用tfe.Iterator 进行数据迭代
5、最好使用面向对象的层(比如 tf.layers.Dense)
6、使用tfe.py_func 代替 tf.py_func
什么情况下使用eager execution?
作为研究人员希望一个灵活的框架
python控制流和数据结构使得实验成为可能
需要开发一个新的模型
即时的错误报告简化了调试
刚接触TensorFlow
eager execution使得我们方便在Python REPL中学习TF API。