1 定义
用于数值计算,支持GPU加速,类似Numpy的库;能够自动微分,用于机器学习研究和试验,是一个较灵活的平台。
2 优势
- 与python debugging工具兼容,可以很方便的进行调试
- 提供了中间出错日志提示
- 允许使用python数据结构
- 很容易执行,并且是python风格的控制流
使用Eager,你不用再担心关于:placeholders,sessions,control dependencies,“lazy loading”,name或者variabel scopes等问题。
3 example
接下来,我们来对比用eager执行的代码到底有多简洁,如下是基于graphs图定义,sesseion执行的一个例子:
import tensorflow as tf
def example():
x = tf.placeholder(tf.float32, shape=[1,1])
m = tf.matmul(x,x)
print(m)
with tf.Session() as sess:
m_out = sess.run(m, feed_dict={x: [[2.]]})
print(m_out)
结果为[[4.]],我们可以看出,执行一个简单的平方数,需要placeholder定义,session执行,run出结果,才可以看到得到结果,第一个print语句,没run之前,是看不到结果的。
那么我们来看下上面的功能,用eager执行怎么实现,如下代码所示:
import tensorflow as tf
import tensorflow.contrib.eager as tfe
tfe.enable_eager_execution()
def example():
x = [[2.]]
m = tf.matmul(x,x)
print(m)
if __name__=='__main__':
example()
代码简洁了很多,不再需要定义placeholder,session run出结果等。
3.1 Gradients
自动求解微分以及集成到eager的执行器里了,让我们简单测试一个例子,看eager执行器怎么求解梯度:
# -*-coding:utf8 -*-
import tensorflow as tf
import tensorflow.contrib.eager as tfe
tfe.enable_eager_execution()
import sys
def loss(x,y):
return (y - x**2)**2
def gradients():
x = tfe.Variable(2.0)
grad = tfe.implicit_gradients(loss)
print(loss(x,7.))
print(grad(x,7.))
if __name__=='__main__':
gradients()
运行结果为:
tf.Tensor(9.0, shape=(), dtype=float32) (loss值)
[(<tf.Tensor: id=59, shape=(), dtype=float32, numpy=-24.0>, <tf.Variable ‘Variable:0’ shape=() dtype=float32, numpy=2.0>)] (梯度值)
4 选择eager的理由
- 如果想要更加灵活的框架,能够在试验中使用python控制流和数据结构,那么eager是个不错的选择
- 开发一个新的模型,debug的时候可以方便的打印中间错误日志信息,那么eager是个不错的选择
- 如果你是一个新入门tensorflow,选择eager,让你可以使用python去探索更多的TF API,在tensorflow 2.0中,默认使用eager执行器。