Tensorflow2.x教程

【Tensorflow2.x教程】
文章目录

    • Eager Execution
    • Autograph

Tensorflow2.0时代终于到来了,相信用过Tensorflow1.x的童鞋们都知道,其入门门槛颇高,主要原因在于其在1.x时代是一个静态图,无法实时编译,因而不少人吐槽并且转向pytorch的怀抱。现在Tensorflow2.0经过蜕变强势归来,其主要有以下几大特性:
  • 使用 tf.keras 作为高级 API,将 Keras API 指定为构建和训练深度学习模型的高级 API,并舍弃掉其他 API。
  • 将用于机器学习的实验和研究平台——Eager execution 设置为默认优先模式,这就意味着任何运算在调用后就会立即运行,从而不再需要预先定义静态图,让执行过程变得更加简单和快捷。
  • 删除了重复的功能,并且不同 API 的调用语法也变得一致、直观,同时它的兼容性更加完善。
  • 提供了完整的低级 API,并可以在 tf.raw_ops 中访问内部操作,同时还提供了变量、checkpoint 以及层的可继承接口。
其中,值得强调的一点是:Eager execution 有助于调试和监控运行中的代码,使用者可使用 Python 调试程序检查变量、层及梯度等对象,并利用装饰器(tf.function)中内置的 Autograph 直接获取图优化和效率,这整个过程不仅能够保留 TensorFlow1.x 基于静态计算图执行的所有优点:性能优化、远程执行,以及序列化、导出和部署的能力,同时还增加了用简单 Python 表达程序的灵活性和易用性。
为了帮助开发者将Tensorflow1.x的代码转化为Tensorflow2.0的代码,谷歌专门提供了转换工具和指导文档,以助用户更方便的完场代码的重构,并且将无法转化的代码标记出来。
Eager Execution TF2.0的eager execution是一种动态运行的方式,并且是默认打开的,其能够使开发者的程序实时动态运行,看到输出结果。
TF1.x的情况是这样的,需要构建静态图和会话才能看到结果
g = tf.Graph() #初始化计算图 with g.as_default(): # 设置为默认计算图 a = tf.constant([[10,10],[11.,1.]]) x = tf.constant([[1.,0.],[0.,1.]]) y = tf.matmul(a, x) # 描述计算图 init_op = tf.global_variables_initializer() # 待执行节点 with tf.Session() as sess: # 配置会话 sess.run(init_op) # 执行节点 print(sess.run(y)) # 输出结果

但是在TF2.0就不用那么麻烦了,可以直接运行
print(f()) a = tf.constant([[10,10],[11.,1.]]) x = tf.constant([[1.,0.],[0.,1.]]) y = tf.matmul(a, x) print(y.numpy()) [[10. 10.] [11.1.]]

这就是eager execution动态运行的好处,所谓鱼与熊掌不可兼得,得此必然失彼,其运行效率自然比不上静态图。兵来将挡,水来土淹,于是有了tf.function来解决运行效率问题。
Autograph AutoGraph是TF提供的一个非常具有前景的工具, 它能够将一部分python语法的代码转译成高效的图表示代码. 由于从TF 2.0开始, TF将会默认使用动态图(eager execution), 因此利用AutoGraph, 在理想情况下, 能让我们实现用动态图写(方便, 灵活), 用静态图跑(高效, 稳定).
Autograph是一个炫酷的魔法功能,可以让我们使用Python语言直接编辑计算图,图的构建主要是通过@tf.function注解函数来实现的。@tf.function可以直接将python
语句转化为图计算。
  • 一个函数如果被tf.function注释,会被编译成图,但是依然可以按照函数调用。
@tf.function def simple_nn_layer(x,y): return tf.nn.relu(x,y) simple_nn_layer ## def simple_nn_layer(x,y): return tf.nn.relu(x,y) ##

函数可以直接被调用
@tf.function def simple_nn_layer(x,y): return tf.nn.relu(tf.matmul(x,y)) simple_nn_layer x=tf.random.uniform((3,3)) y=tf.random.uniform((3,3)) simple_nn_layer(x,y)

  • 如果在注释的函数中,有被调用的函数,那么被调用的函数也将以图的模式运行。
def line_layer(x): return x*2+1 @tf.function def deep_nn(x): return tf.nn.relu(line_layer(x)) print(deep_nn) #

直接调用,两个函数都会被转化为图计算。
deep_nn(tf.constant(1,2,3)) #

后面将会陆续更新tf.keras的高级API的用法。

    推荐阅读