TensorFlow 由 Google Brain 团队创建,最初于 2015 年向公众发布,是一个用于数值计算和大规模机器学习的开源库。TensorFlow 将大量机器学习和深度学习模型和算法(也称为神经网络)捆绑在一起,并通过常见的编程隐喻使它们变得有用。它使用 Python 或 JavaScript 为构建应用程序提供方便的前端 API,同时在高性能 C++ 中执行这些应用程序。
TensorFlow与 PyTorch和 Apache MXNet 等框架竞争,可以训练和运行深度神经网络,用于手写数字分类、图像识别、词嵌入、循环神经网络、用于机器翻译的序列到序列模型、自然语言处理和基于 PDE(偏微分方程)的模拟。最重要的是,TensorFlow 支持大规模生产预测,使用相同的模型进行训练。
TensorFlow 还拥有广泛的预训练模型库,可用于你自己的项目。你还可以使用TensorFlow 模型园中的代码 作为训练你自己的模型的最佳实践示例。
TensorFlow 的工作原理
TensorFlow 允许开发人员创建数据流图——描述数据如何通过图或一系列处理节点移动的结构。图中的每个节点都代表一个数学运算,节点之间的每个连接或边都是一个多维数据数组,或称张量。
TensorFlow 应用程序可以在大多数方便的目标上运行:本地机器、云中的集群、iOS 和 Android 设备、CPU 或 GPU。如果你使用 Google 自己的云,你可以在 Google 的自定义TensorFlow 处理单元(TPU) 芯片上运行 TensorFlow,以进一步加速。不过,TensorFlow 创建的结果模型可以部署在大多数用于提供预测的设备上。
TensorFlow 2.0 于 2019 年 10 月发布,根据用户反馈对框架进行了多种改进,使其更易于使用(例如,通过使用相对简单的 Keras API 进行模型训练)和更高的性能。得益于新的 API,分布式训练更易于运行,并且对 TensorFlow Lite 的支持使在更多种类的平台上部署模型成为可能。但是,必须重写为早期版本的 TensorFlow 编写的代码——有时只是轻微的,有时是显着的——以最大限度地利用新的 TensorFlow 2.0 功能。
经过训练的模型可用于 通过 使用 REST 或gRPC API的 Docker 容器将预测作为服务提供。对于更高级的服务场景,你可以使用Kubernetes
将 TensorFlow 与 Python 结合使用
TensorFlow 通过 Python 语言为程序员提供了所有这些功能。Python 易于学习和使用,它提供了方便的方法来表达如何将高级抽象耦合在一起。TensorFlow 在 Python 3.7 到 3.10 版本上受支持,虽然它可以在早期版本的 Python 上工作,但不能保证这样做。
TensorFlow 中的节点和张量是 Python 对象,TensorFlow 应用程序本身就是 Python 应用程序。然而,实际的数学运算并不是在 Python 中执行的。通过 TensorFlow 提供的转换库被编写为高性能 C++ 二进制文件。Python 只是引导各个部分之间的流量,并提供高级编程抽象来将它们连接在一起。
TensorFlow 中的高级工作(创建节点和层并将它们链接在一起)使用Keras库。Keras API 表面上很简单;一个三层的基本模型可以在不到 10 行代码中定义,同样的训练代码只需要几行代码。但如果你想“揭开面纱”,做更细粒度的工作,比如编写自己的训练循环,你可以这样做。
将 TensorFlow 与 JavaScript 结合使用
Python 是与 TensorFlow 和机器学习一起工作的最流行的语言。但是 JavaScript 现在也是 TensorFlow 的一流语言,JavaScript 的巨大优势之一是它可以在任何有网络浏览器的地方运行。
TensorFlow.js(称为 JavaScript TensorFlow 库)使用 WebGL API 通过系统中可用的任何 GPU 来加速计算。也可以使用WebAssembly后端来执行,如果你只在 CPU 上运行,它比常规的 JavaScript 后端更快,但最好尽可能使用 GPU。预建模型让你可以启动并运行简单的项目,让你了解事情的运作方式。
TensorFlow 精简版
经过训练的 TensorFlow 模型也可以部署在边缘计算或移动设备上,例如 iOS 或 Android 系统。TensorFlow Lite工具集通过允许你在模型大小和准确性之间进行权衡,优化 TensorFlow 模型以在此类设备上良好运行。较小的模型(即 12MB 对 25MB,甚至 100+MB)的准确度较低,但准确度的损失通常很小,并且被模型的速度和能效所抵消。
为什么使用 TensorFlow
TensorFlow 为机器学习开发提供的最大好处是抽象。开发人员可以专注于整体应用程序逻辑,而不是处理实现算法的细节,或者找出将一个函数的输出连接到另一个函数的输入的正确方法。TensorFlow 负责幕后的细节。
TensorFlow 为需要调试和了解 TensorFlow 应用程序的开发人员提供了更多便利。每个图形操作都可以单独且透明地进行评估和修改,而不是将整个图形构建为单个不透明对象并立即对其进行评估。这种所谓的“急切执行模式”作为旧版 TensorFlow 的一个选项提供,现在已成为标准。
TensorBoard可视化套件可让你通过基于 Web 的交互式仪表板检查和分析图表的运行方式。Tensorboard.dev服务 (由 Google 托管)可让你托管和共享用 TensorFlow 编写的机器学习实验。它可以免费用于存储多达 100M 的标量、1GB 的张量数据和 1GB 的二进制对象数据。(请注意,托管在 Tensorboard.dev 中的任何数据都是公开的,因此请勿将其用于敏感项目。)
TensorFlow 还从谷歌一流商业机构的支持中获得了许多优势。谷歌推动了该项目的快速发展,并创造了许多重要的产品,使 TensorFlow 更易于部署和使用。上述用于在谷歌云中加速性能的 TPU 芯片只是一个例子。
使用 TensorFlow 进行确定性模型训练
TensorFlow 实现的一些细节使得某些训练作业很难获得完全确定的模型训练结果。有时,在一个系统上训练的模型与在另一个系统上训练的模型会略有不同,即使它们提供了完全相同的数据。这种差异的原因很棘手——一个原因是随机数是如何播种的以及在哪里播种;另一个与使用 GPU 时的某些非确定性行为有关。TensorFlow 的 2.0 分支有一个选项,可以通过几行代码在整个工作流程中启用确定性。但是,此功能以性能为代价,并且仅应在调试工作流时使用。
TensorFlow 与 PyTorch、CNTK 和 MXNet
TensorFlow 与许多其他机器学习框架竞争。PyTorch、CNTK 和 MXNet 是满足许多相同需求的三个主要框架。让我们快速了解一下它们在哪些方面脱颖而出并与 TensorFlow 相比不足:
- PyTorch是用 Python 构建的,并且与 TensorFlow 有许多其他相似之处:引擎盖下的硬件加速组件、允许即用即设计工作的高度交互的开发模型,以及已经包含许多有用的组件。对于需要在短时间内启动并运行的项目的快速开发,PyTorch通常是更好的选择,但 TensorFlow 更适合大型项目和更复杂的工作流程。
- CNTK是 Microsoft Cognitive Toolkit,在使用图结构来描述数据流方面与 TensorFlow 类似,但它主要侧重于创建深度学习神经网络。CNTK可以更快地处理许多神经网络作业,并拥有更广泛的 API(Python、C++、C#、Java)。但目前它不像 TensorFlow 那样容易学习或部署。它也仅在 GNU GPL 3.0 许可下可用,而 TensorFlow 在更自由的 Apache 许可下可用。而且 CNTK 没有那么积极的发展。上一个主要版本是在 2019 年。
- Apache MXNet被 Amazon 采用为 AWS 上的首要深度学习框架,可以在多个 GPU 和多台机器上几乎线性扩展。MXNet还支持广泛的语言 API——Python、C++、Scala、R、JavaScript、Julia、Perl、Go——尽管它的原生 API 不像 TensorFlow 那样好用。它还拥有一个小得多的用户和开发人员社区。
原文What is TensorFlow? The machine learning library explained