TensorFlow 现在已经不仅是一个单纯的工具包了,而是发展成为了一个平台,在易用性、分布式训练和部署等方面都取得了长足的进步。
如今已经没有人质疑机器学习和深度学习的重要性了。数十年来这一行业让人们见识过无数承诺、骗局和失望,时至今日两大技术终于带来了众多实际应用。机器学习或深度学习应用离充分完善还有很长的路要走,但现有的成果已经非常喜人了。
在所有优秀的机器学习和深度学习框架中,TensorFlow 是最成熟的,在研究论文中被引用最多(就算排除谷歌员工的引用也是如此),也有着最出色的生产实践案例。它可能不是最容易学习的框架,但比起它 2016 年刚发布时的情况,现在的 TensorFlow 对新人要友好得多。TensorFlow 还是许多谷歌服务的基础。
TensorFlow 2.0 网站将该项目描述为“端到端开源机器学习平台”。实际上 TensorFlow 已进化成为一个更全面的“工具、库和社区资源生态系统”,可帮助研究人员构建和部署人工智能助力的应用。
TensorFlow 2.0 有四大组成部分:
TensorFlow 核心,一个用于开发和训练机器学习模型的开源库;TensorFlow.js,一个用于在浏览器和 Node.js 上训练和部署模型的 JavaScript 库;TensorFlow Lite,一个轻量级库,用于在移动和嵌入式设备上部署模型;TensorFlow Extended,一个在大型生产环境中准备数据、训练、验证和部署模型的平台。TensorFlow 2.0 生态系统包括对 Python、JavaScript 和 Swift 的支持,以及对云、浏览器和边缘设备的部署支持。TensorBoard(可视化)和 TensorFlow Hub(模型库)都是很有用的工具。TensorFlow Extended(TFX)则支持端到端生产流水线。
这些年来,TensorFlow 逐渐发展为基于数据流图的机器学习和神经网络库,拥有较高的学习曲线和一个底层 API。对普通人来说 TensorFlow 2.0 已经不再那么难学了,2.0 版本还拥有一个高级 Keras API,支持在 JavaScript 中运行、在移动和嵌入式设备上部署以及在大型生产环境中运行。
TensorFlow 的竞争对手包括 Keras(可能使用除 TensorFlow 之外的其他后端)、MXNet、PyTorch、Scikit-learn和 Spark MLlib。最后两个主要是机器学习框架,缺乏深度学习的相关设施。
你可以同时使用多种方案。在单条流水线中同时使用多个框架是非常合理的,例如使用 Scikit-learn 准备数据并使用 TensorFlow 训练模型。
TensorFlow 核心
TensorFlow 2.0 的设计重点就是简洁易用,它的新特性包括 Eager Execution、直观的高级 API 以及在任何平台上灵活构建模型等更新。前两个特性值得深入研究。
Eager Execution
Eager Execution 意味着 TensorFlow 代码被定义后会立即运行,而不是先将节点和边缘添加一个图上,稍后再在一个会话中运行——后者是 TensorFlow 原来使用的模式。例如,TensorFlow r0.10 早期版本的“Hello,World!”脚本如下所示:
$ python...>>> import tensorflow as tf>>> hello = tf.constant('Hello, TensorFlow!')>>> sess = tf.Session()>>> print(sess.run(hello))Hello, TensorFlow!>>> a = tf.constant(10)>>> b = tf.constant(32)>>> print(sess.run(a + b))42>>> exit()
注意这里使用的 tf.Session() 和 sess.run()。在 TensorFlow 2.0 中,Eager Execution 模式是默认的,如下例所示。
(上图最后一段:)Eager Execution 改变了 Tensorflow 的运行机制——现在它立即给出运算并返给 Python 结果。tf.Tensor 对象引用了具体的值提供给计算图中的节点,替换了符号句柄。因此在会话中不用使用先建立后运行的计算图了,使用 print() 或调试器查看结果更容易。计算、打印和检查张量值不会影响梯度计算。
TensorFlow 2.0 中的 Eager Execution 示意。这个笔记本可以在谷歌 Colab 中运行,或者在安装好预设的 Jupyter 笔记本中也能运行。
tf.keras
前面的两个示例都使用了底层 TensorFlow API。“活用 TensorFlow 2.0 指南”则使用了高级别的 tf.kerasAPI 取代了旧的底层 API;这将大大减少你需要编写的代码量。你只需要每层写一行代码就能构建 Keras 神经网络,如果能善用循环结构的话需要的代码就更少了。下面的示例演示了 Keras 数据集和顺序模型 API,它们运行在谷歌 Colab 中;谷歌 Colab 用来运行 TensorFlow 样本和实验很方便(还是免费的)。请注意,Colab 除了 CPU 外还提供了 GPU 和 TPU 实例。
上图是一个 TensorFlow 笔记本,用于训练基本的深度神经网络对 MNIST 手写数字图像进行分类。这是在谷歌 Colab 上运行的 TensorFlow 示例笔记本。注意这里使用了 tf.keras.datasets 来提供 MNIST 图像。
过渡到 TensorFlow 2.0
在撰写本文时,从 TensorFlow 1.14 到 TensorFlow 2.0 的过渡还在进行中,如下面的截图所示。目前有两个待办事项、23 个正在进行的任务以及 34 个已完成的任务。正在进行的任务中既有完全没有进展的(可能是因为当事人退出),也有几乎完成的(代码已进入存储库主分支,但尚未经过审查和部署)。
将模型升级到 TensorFlow 2.0
使用 tf.function
Eager Execution 模式的缺点是可能会损失一些编译和执行流程图的性能。有一种方法可以在不完全关闭 Eager Execution 模式的情况下恢复性能,它就是 tf.function。
基本上,当你使用 @tf.function 注释一个函数时后者将被编译成一个图,它和它调用的任何函数就(可能)更快地执行、支持在 GPU 或 TPU 上运行,还支持导出到 SavedModel。tf.function 的一项便利的新功能是 AutoGraph,它自动将 Python 控制流语句编译为 TensorFlow 控制操作。
分布式训练
以前我研究 TensorFlow 时有两种方法可以运行分布式训练:使用异步参数服务器,或使用第三方的 Horovod 项目——该项目是同步的并使用 all-reduce 算法。现在新版有五种原生的 TensorFlow 分布式策略以及一个用于选择所需策略的 API,tf.distribute.Strategy;它允许你跨多个 GPU、多台计算机或多个 TPU 分发训练。此 API 还可用于在不同平台上分发评估和预测。
TensorFlow 现在支持五种原生分布式策略,TensorFlow 2.0 beta 还对三种训练 API 提供不同级别的支持。
TensorFlow.js
TensorFlow.js是一个用于在 JavaScript 中开发和训练机器学习模型并在浏览器或 Node.js 中部署它们的库。还有一个基于 TensorFlow.js 的高级库 ml5.js,使用户无需直接面对复杂的张量和优化器。
TensorFlow.js 运行在浏览器中,支持移动设备和桌面设备。如果你的浏览器支持 WebGL 着色器 API,TensorFlow.js 就可以使用它们并利用 GPU 计算能力,带来相比 CPU 后端多达 100 倍的加速效果。在配备 GPU 的计算机上,TensorFlow.js 演示)在浏览器中运行得非常快。
在 Node.js 上,TensorFlow.js 可以使用已安装的 TensorFlow 版本作为后端,或者运行基本的 CPU 后端。CPU 后端是纯 JavaScript 的,并行优化不够充分。
TensorFlow Lite是一个用于设备上推断的开源深度学习框架。它目前为 iOS、ARM64 和树莓派构建了模型。
TensorFlow Lite 的两大组件分别是解释器和转换器。解释器用来在许多不同的硬件类型上运行特别针对优化的模型。转换器则将 TensorFlow 模型转换为高效形式供解释器使用,并可引入优化以改善程序体积和性能。预先训练的模型有图像分类、对象检测、智能回复、姿势估计和语义分割等类型。还有用于手势识别、图像分类、对象检测和语音识别的示例应用。
TensorFlow Extended
TensorFlow Extended 示意图。
Swift for TensorFlow
Swift for TensorFlow是一个用于深度学习和可微分编程的下一代(并且仍不稳定)平台。它有一个用于训练的高级 API,看起来很像 Python TensorFlow,但它也支持使用 differentiable 属性自动微分构建到 Swift 编译器的一个 fork 中。Swift for TensorFlow 可以导入和调用 Python 代码,使开发者更容易从 Python TensorFlow 过渡过来。
总的来说,TensorFlow 2.0 已经在很多方面取得了很大进展。在 tf.keras API 和 Eager Execution 模式的帮助下,新版核心框架更易于学习、使用和调试。你可以有选择地将要编译的函数标记为图形。有五种方法可以进行分布式训练和推断。
新版有一套完整的组件,也就是 TFX,用于构建从数据验证到推断模型管理的全套机器学习流水线。你可以在浏览器或 Node.js 上运行 TensorFlow.js,还可以在移动设备和嵌入式设备上运行 TensorFlow Lite。最后,Swift for TensorFlow 将为模型构建开辟新的可能性