【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 以及层的可继承接口。
为了帮助开发者将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的用法。