写点什么

Tensorflow 2.0 到底好在哪里?

  • 2019-08-03
  • 本文字数:5032 字

    阅读完需:约 17 分钟

Tensorflow 2.0到底好在哪里?


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 r0.10(2016)(https://www.infoworld.com/article/3127397/review-tensorflow-shines-a-light-on-deep-learning.html)和 TensorFlow 1.5(2018)(https://www.infoworld.com/article/3250165/tensorflow-review-the-best-deep-learning-library-gets-better.html)。


这些年来,TensorFlow 逐渐发展为基于数据流图的机器学习和神经网络库,拥有较高的学习曲线和一个底层 API。对普通人来说 TensorFlow 2.0 已经不再那么难学了,2.0 版本还拥有一个高级 Keras API,支持在 JavaScript 中运行、在移动和嵌入式设备上部署以及在大型生产环境中运行。


TensorFlow 的竞争对手包括 Keras(可能使用除 TensorFlow 之外的其他后端)(https://www.infoworld.com/article/3305058/review-keras-sails-through-deep-learning.html)、MXNet(https://www.infoworld.com/article/3318557/review-mxnet-deep-learning-shines-with-gluon.html)(与 Gluon,https://www.infoworld.com/article/3318557/review-mxnet-deep-learning-shines-with-gluon.html)、PyTorch(https://www.infoworld.com/article/3289633/pytorch-review-a-deep-learning-framework-built-for-speed.html)、Scikit-learn(https://www.infoworld.com/article/3158509/review-scikit-learn-shines-for-simpler-machine-learning.html)和 Spark MLlib(https://www.infoworld.com/article/3141605/review-spark-lights-up-machine-learning.html)。最后两个主要是机器学习框架,缺乏深度学习的相关设施。


你可以同时使用多种方案。在单条流水线中同时使用多个框架是非常合理的,例如使用 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 指南”(https://www.tensorflow.org/beta/guide/effective_tf2)则使用了高级别的 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 的过渡(https://github.com/orgs/tensorflow/projects/4)还在进行中,如下面的截图所示。目前有两个待办事项、23 个正在进行的任务以及 34 个已完成的任务。正在进行的任务中既有完全没有进展的(可能是因为当事人退出),也有几乎完成的(代码已进入存储库主分支,但尚未经过审查和部署)。



从 TensorFlow 1.14 到 TensorFlow 2.0 的过渡状态可通过以下网址跟踪:https://github.com/orgs/tensorflow/project/4。此截图生成于 6 月 21 日,但请注意该页面自 4 月 17 日以来都未更新。

将模型升级到 TensorFlow 2.0

就像很多开源项目的大版本更新一样,TensorFlow 2.0 对 API 引入了许多重大更改,需要你随之升级你的代码(https://www.tensorflow.org/beta/guide/migration_guide)。所幸我们有一个随 TensorFlow 2.0 自动安装的 Python 代码升级脚本(https://www.tensorflow.org/beta/guide/upgrade),还有一个给无法升级的 API 符号用的兼容模块(compat.v1),只需使用字符串替换即可。运行升级脚本后,你的程序可能会在 TensorFlow 2.0 上运行,但是会引用 tf.compat.v1 命名空间,你得在有空的时候处理一下以保持代码清洁。此外,你可以将 GitHub repos 上的 Jupyter 笔记本升级到 TensorFlow 2.0(http://tf2up.ml/)。

使用 tf.function

Eager Execution 模式的缺点是可能会损失一些编译和执行流程图的性能。有一种方法可以在不完全关闭 Eager Execution 模式的情况下恢复性能,它就是 tf.function。


基本上,当你使用 @tf.function 注释一个函数时后者将被编译成一个图,它和它调用的任何函数就(可能)更快地执行、支持在 GPU 或 TPU 上运行,还支持导出到 SavedModel。tf.function 的一项便利的新功能是 AutoGraph(https://www.tensorflow.org/beta/guide/autograph),它自动将 Python 控制流语句编译为 TensorFlow 控制操作。

分布式训练

以前我研究 TensorFlow 时有两种方法可以运行分布式训练:使用异步参数服务器,或使用第三方的 Horovod 项目——该项目是同步的并使用 all-reduce 算法。现在新版有五种原生的 TensorFlow 分布式策略(https://www.tensorflow.org/beta/guide/distribute_strategy),以及一个用于选择所需策略的 API,tf.distribute.Strategy;它允许你跨多个 GPU、多台计算机或多个 TPU 分发训练。此 API 还可用于在不同平台上分发评估和预测。



TensorFlow 现在支持五种原生分布式策略,TensorFlow 2.0 beta 还对三种训练 API 提供不同级别的支持。

TensorFlow.js

TensorFlow.js(https://www.tensorflow.org/js)是一个用于在 JavaScript 中开发和训练机器学习模型并在浏览器或 Node.js 中部署它们的库。还有一个基于 TensorFlow.js 的高级库 ml5.js(https://ml5js.org/),使用户无需直接面对复杂的张量和优化器。


TensorFlow.js 运行在浏览器中(https://www.tensorflow.org/js/guide/platform_environment),支持移动设备和桌面设备。如果你的浏览器支持 WebGL 着色器 API,TensorFlow.js 就可以使用它们并利用 GPU 计算能力,带来相比 CPU 后端多达 100 倍的加速效果。在配备 GPU 的计算机上,TensorFlow.js 演示(https://www.tensorflow.org/js/demos/)在浏览器中运行得非常快。


在 Node.js 上,TensorFlow.js 可以使用已安装的 TensorFlow 版本作为后端,或者运行基本的 CPU 后端。CPU 后端是纯 JavaScript 的,并行优化不够充分。


你可以在浏览器上运行官方 TensorFlow.js 模型(https://www.tensorflow.org/js/models/)、转换 Python 模型(https://www.tensorflow.org/js/tutorials#convert_pretained_models_to_tensorflowjs)、使用迁移学习来用你自己的数据自定义模型(https://www.tensorflow.org/js/tutorials/transfer/what_is_transfer_learning),以及直接在 JavaScript 中构建和训练模型(https://www.tensorflow.org/js/tutorials)。

TensorFlow Lite

TensorFlow Lite(https://www.tensorflow.org/lite/)是一个用于设备上推断的开源深度学习框架。它目前为 iOS、ARM64 和树莓派构建了模型。


TensorFlow Lite 的两大组件分别是解释器和转换器。解释器用来在许多不同的硬件类型上运行特别针对优化的模型。转换器则将 TensorFlow 模型转换为高效形式供解释器使用,并可引入优化以改善程序体积和性能。预先训练的模型有图像分类、对象检测、智能回复、姿势估计和语义分割等类型。还有用于手势识别、图像分类、对象检测和语音识别的示例应用。

TensorFlow Extended

TensorFlow Extended(TFX)(https://www.tensorflow.org/tfx/)是用于部署机器学习生产流水线的端到端平台。你训练好一个模型就要考虑使用 TFX 了。其流水线包括数据验证(https://www.tensorflow.org/tfx/guide/tfdv)、功能设计(https://www.tensorflow.org/tfx/transform/get_started)、建模(https://www.tensorflow.org/tfx/guide/train)、模型评估(https://www.tensorflow.org/tfx/model_analysis/get_started)、服务推断(https://www.tensorflow.org/tfx/guide/serving)以及在线平台、移动原生平台和 JavaScript 平台的部署管理。下图显示了 TFX 流水线的组件是如何组合在一起的。



TensorFlow Extended 示意图。

Swift for TensorFlow

Swift for TensorFlow(https://www.tensorflow.org/swift)是一个用于深度学习和可微分编程的下一代(并且仍不稳定)平台。它有一个用于训练的高级 API,看起来很像 Python TensorFlow,但它也支持使用 @differentiable 属性自动微分构建到 Swift 编译器的一个 fork 中。Swift for TensorFlow 可以导入和调用 Python 代码,使开发者更容易从 Python TensorFlow 过渡过来。

TensorFlow 工具

目前有七种工具支持 TensorFlow(https://www.tensorflow.org/resources/tools)。它们分别是 TensorBoard,TensorFlow 图的一组可视化工具;TensorFlow Playground,一个可调节的在线神经网络;CoLab,又名 Colaboratory,一个免费的在线 Jupyter 笔记本环境;What-If 工具,可用于探索和调试 TensorBoard、CoLab 或 Jupyter 笔记本中的模型;ML Perf,流行的机器学习基准测试套件;XLA(加速线性代数),一种用于线性代数的特定领域编译器,可优化 TensorFlow 计算;和 TFRC(TensorFlow 研究云),一个由 1000 多个云 TPU 组成的集群,研究人员可以申请免费使用。


总的来说,TensorFlow 2.0 测试版已经在很多方面取得了很大进展。在 tf.keras API 和 Eager Execution 模式的帮助下,新版核心框架更易于学习、使用和调试。你可以有选择地将要编译的函数标记为图形。有五种方法可以进行分布式训练和推断。


新版有一套完整的组件,也就是 TFX,用于构建从数据验证到推断模型管理的全套机器学习流水线。你可以在浏览器或 Node.js 上运行 TensorFlow.js,还可以在移动设备和嵌入式设备上运行 TensorFlow Lite。最后,Swift for TensorFlow 将为模型构建开辟新的可能性。


原文链接https://www.infoworld.com/article/3405641/tensorflow-2-review-easier-end-to-end-machine-learning.html


2019-08-03 09:009355

评论

发布
暂无评论
发现更多内容

面试腾讯T3,过关斩将直通3面,终斩获offer流下了激动的泪水(腾讯面经总结分享)

Java架构之路

Java 程序员 架构 面试 编程语言

LeetCode题解:322. 零钱兑换,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

【LeetCode】爱生气的书店老板Java题解

Albert

算法 LeetCode 28天写作 2月春节不断更

从架构设计的演进来看,我们真的需要DDD

三石

DDD 软件架构 话题讨论

农产品区块链溯源平台,区块链溯源方案

13530558032

做一个很出色的程序员

四猿外

Java 程序员 面试 架构师 职场成长

jenkins Android 自动构建-扫码下载

三爻

IAR故障解决:由于找不到mfc140u.dll,无法继续执行代码

不脱发的程序猿

28天写作 二月春节不断更 IAR 软件故障 DLL库

Java训练营第一周习题:01字节码分析

现实中游走

Java 字节码

读懂框架设计的灵魂—Java反射机制

Java 编程 架构

Protobuf源码解读之编解码

batman

protubuf zigzag varint

60K*17薪的面试题是什么样的,需要具备什么技术?首发“Java面试考点大全”

Java架构之路

Java 程序员 架构 面试 编程语言

快速搭建本土「Clubhouse」

anyRTC开发者

ios android WebRTC RTC 语音通话

一篇学会RSA JavaScript加密,涉及OpenSSL

梁龙先森

JavaScript 大前端 28天写作 2月春节不断更

使用 RxJS 设计实现一个下载中心功能

laoergege

大前端 RXJS

日记 2021年2月23日(周二)

Changing Lin

2月春节不断更

话题讨论 | 你”节后综合症“了吗?

程序员架构进阶

话题讨论 28天写作 2月春节不断更 话题王者 节后焦虑

1月干货总结:EasyDL上线时序预测模型,文档翻译全新发布

百度大脑

深入理解 Web 协议(三):HTTP 2

vivo互联网技术

Web HTTP HTTP2.0

区块链电子合同应用平台,区块链存证系统

13530558032

「产品经理训练营」第五章作业

Sòrγy_じò ぴé

产品经理训练营

为了面试阿里巴巴、腾讯、字节跳动、京东、华为等大厂,我收集了8家大厂高频Java面试真题集锦(含答案)

Java架构之路

Java 程序员 架构 面试 编程语言

2021最新总结:阿里/京东/饿了么/拼多多/爱奇艺面经分享(堪称Offer收割机)

比伯

Java 编程 架构 面试 计算机

产品训练营第五周作业

产品经理训练营

基于simhash的文本去重原理

行者AI

Python hash

话题讨论 | 技术从入门到熟练是怎样的?

happlyfox

话题讨论 28天写作

架构设计篇之微服务实战笔记(四)

小诚信驿站

架构师 刘晓成 小诚信驿站 28天写作 架构师成长笔记

读书笔记-MySQL索引

yunCrush

互联网员工下班时间曝光:所有的光鲜,都有加班的味道

不脱发的程序猿

996 28天写作 二月春节不断更 加班文化 互联网企业

趣谈哈希表优化:从规避 Hash 冲突到利⽤ Hash 冲突

百度Geek说

大前端 测试 哈希表 hash 研发工具

智慧组工党务解决方案,智慧党建系统

13530558032

Tensorflow 2.0到底好在哪里?_AICon_Martin Heller_InfoQ精选文章