Tensorflow2.x教程

文章目录

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
##<tensorflow.python.eager.def_function.Function at 0x2b4fa51fb70>
def simple_nn_layer(x,y):
    return tf.nn.relu(x,y)
##<function __main__.simple_nn_layer(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)
#<tensorflow.python.eager.def_function.Function at 0x2b4fa58fcc0>

直接调用,两个函数都会被转化为图计算。

deep_nn(tf.constant(1,2,3))
#<tf.Tensor: id=394, shape=(3,), dtype=float64, numpy=array([3., 3., 3.])>

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

发布了24 篇原创文章 · 获赞 2 · 访问量 1181

猜你喜欢

转载自blog.csdn.net/qq_40176087/article/details/100703113