Tensorflow2.0时代终于到来了,相信用过Tensorflow1.x的童鞋们都知道,其入门门槛颇高,主要原因在于其在1.x时代是一个静态图,无法实时编译,因而不少人吐槽并且转向pytorch的怀抱。现在Tensorflow2.0经过蜕变强势归来,其主要有以下几大特性:
其中,值得强调的一点是:Eager execution 有助于调试和监控运行中的代码,使用者可使用 Python 调试程序检查变量、层及梯度等对象,并利用装饰器(tf.function)中内置的 Autograph 直接获取图优化和效率,这整个过程不仅能够保留 TensorFlow1.x 基于静态计算图执行的所有优点:性能优化、远程执行,以及序列化、导出和部署的能力,同时还增加了用简单 Python 表达程序的灵活性和易用性。
为了帮助开发者将Tensorflow1.x的代码转化为Tensorflow2.0的代码,谷歌专门提供了转换工具和指导文档,以助用户更方便的完场代码的重构,并且将无法转化的代码标记出来。
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是TF提供的一个非常具有前景的工具, 它能够将一部分python语法的代码转译成高效的图表示代码. 由于从TF 2.0开始, TF将会默认使用动态图(eager execution), 因此利用AutoGraph, 在理想情况下, 能让我们实现用动态图写(方便, 灵活), 用静态图跑(高效, 稳定).
Autograph是一个炫酷的魔法功能,可以让我们使用Python语言直接编辑计算图,图的构建主要是通过@tf.function注解函数来实现的。@tf.function可以直接将python
语句转化为图计算。
@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)
<tf.Tensor: id=376, shape=(3, 3), dtype=float32, numpy=
array([[1.3959488 , 0.7787856 , 0.649172 ],
[0.92637485, 0.6027691 , 0.1335081 ],
[1.4911242 , 0.8148477 , 0.8164478 ]], dtype=float32)>
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的用法。