TensorFlow 将发布v2.0 — TensorFlow 招牌特性回顾
原创: Hujun 专知 今天
【导读】TensorFlow 2.0要来了,伴随着一些令人期待的改进,但同时也带来了版本上的一些不兼容。本文介绍TensorFlow 2.0即将带来的一些变化,以及老版本TensorFlow中的一些招牌特性。
TensorFlow 2.0的变化
近几天,TensorFlow在Google Group中发布了关于TensorFlow 2.0的消息:
https://groups.google.com/a/tensorflow.org/forum/?utm_medium=email&utm_source=footer#!topic/announce/qXfsxr2sF-0
消息中主要提到了以下几点:
-
Eager execution will be a central feature of 2.0:动态图模式(eager)是在TensorFlow 1.x中途被加入的,在1.x中仍有一定的不成熟,然而TensorFlow 2.0会将动态图模式(eager)作为一个核心特性。
-
Support for more platforms and languages:支持更多的平台和语言。
-
Compatibility and Continuity: 由于遵循semantic versioning,一些不合理的接口在1.x中无法进行直接的修改。2.0的发布使得官方有机会来纠正这些错误。TensorFlow官方会提供从1.x代码向2.x代码转换的工具,在TensorFlow 0.x向TensorFlow 1.0升级时官方就提供了类似的工具。然而并不是所有的转换都可以被自动完成,因为有一些1.x中的方法在2.x中并没有等价物。因此,TensorFlow 2.x提供了tensorflow.compat.v1模块,这是一个兼容模块,它包含了TensorFlow 1.x完整的API,并且会在整个TensorFlow 2.x的生命周期中被维护。
-
On-disk compatibility:对于TensorFlow 2.0沿用了1.x中SavedModels和GraphDefs的内核,并没有对他们做太大的改进,但如果要和2.0版本兼容,1.x版中的checkpoints中的变量名需要做一定的转换。
-
tf.contrib:在以前的版本中,tf.contrib模块一直和TensorFlow核心代码在一个仓库中维护。TensorFlow 2.0将移除tf.contrib,以独立的extension(扩展)来代替tf.contrib。
TensorFlow历史版本招牌特性
在TensorFlow 2.0到来之前,我们先来回顾一下TensorFlow的历史版本中有哪些招牌特性:
静态图
-
官方链接:https://www.tensorflow.org/guide/graphs
-
简介:静态图为TensorFlow带来了执行效率和可移植性。算法工程师用TensorFlow Python API将训练好的静态图保存为模型,开发工程师可以利用C++/Java/Javascript等直接高效地调用训练好的模型。看起来笨拙的静态图实际上为TensorFlow带来了效率和可移植性。
tf.data.Dataset
-
官方链接:https://www.tensorflow.org/api_docs/python/tf/data/Dataset
-
简介:tf.data.Dataset提供了强大的数据预处理流水线,例如数据自动shuffle、划分batch等。在静态图模式中,tf.data.Dataset的数据预处理可以被看做静态图的一部分,在动态图模式中,tf.data.Dataset可以被当做强大的Generator,例如我们可以直接用python的for in语句来获取每个batch的数据:
dataset = tf.data.Dataset.from_tensor_slices((data.train.images, data.train.labels))... ... for (batch, (images, labels)) in enumerate(dataset): ... xxxx
动态图模式(eager)
-
官方链接:https://www.tensorflow.org/guide/eager
-
简介:早期TensorFlow的静态图一直被开发者诟病难以调试,一大波开发者从而转向有动态图的PyTorch,然而TensorFlow在去年推出了动态图模式eager,这是一个革命性的特性,使开发者能够像PyTorch一样使用TensorFlow。另外,TensorFlow的动态图并没有使用独立的API,而是使用和静态图里一样的API,在程序顶部通过一个开关来开启或关闭动态图模型,因此学习和迁移的成本都很低。
x = [[2.]] m = tf.matmul(x, x) print("hello, {}".format(m)) # => "hello, [[4.]]"
AutoGraph
-
官方链接:https://www.tensorflow.org/guide/autograph
-
简介:想构建静态图却又想像动态图那样编写代码,可以试试autograph注解。在动态图一样写法的函数上加上@autograph.convert()注解,就可以将其转换为实际的静态图构建函数。既能享受静态图在模型发布等上的优势,又可以像编写动态图那样方便地控制图的结构。
@autograph.convert() def nearest_odd_square(x): if x > 0: x = x * x if x % 2 == 0: x = x + 1 return x with tf.Graph().as_default(): with tf.Session() as sess: print(sess.run(nearest_odd_square(tf.constant(4)))) print(sess.run(nearest_odd_square(tf.constant(5)))) print(sess.run(nearest_odd_square(tf.constant(6))))
TensorFlow.js
-
官方链接:https://js.tensorflow.org/
-
简介:TensorFlow.js使得我们可以在浏览器或Node.js中使用TensorFlow。它可以导入、训练和调整模型,可以与用Python等训练的模型兼容。另外,TensorFlow.js的效率已经和Python版TensorFlow的效率相同。
TensorFlow历史版本中还有Estimator、分布式计算、TensorFlow Serving、TensorFlow Lite等重要特性,每一个特性官方都做了很强的支撑,这里就不一一介绍了。