TensorFlow2.0简介

谷歌公司在 2011 年启动了谷歌大脑(Google Brain)项目,该项目旨在探索超大规模的深度神经网络,一方面用于研究,另一方面也希望可以在谷歌公司的各类产品中使用,DistBelief 分布式机器学习框架便是该项目的一部分。

DistBelief 曾在谷歌公司内部得到了广泛的使用,有超过 50 个谷歌公司团队(包括其子公司)在他们的产品中使用 DistBelief 部署了深度神经网络,包括搜索、广告、地图、语音识别及 YouTube 等系统。

TensorFlow 是谷歌公司在 DistBelief 的经验和基础上开发的第二代大规模分布式机器学习系统。为了打造一个行业标准,以及借助社区的力量来完善 TensorFlow 等目的,谷歌公司于 2015 年 11 月将 TensorFlow 在 GitHub 上开源。

在从 TensorFlow1.0 正式版发布(2017 年 2 月)到 TensorFlow2.0 的 RC 版发布(2019 年 9 月)仅 2 年多时间中,TensorFlow 已经成为各类深度学习框架中的主力军。

TensorFlow 使用数据流模型来描述计算过程,并将它们映射到了各种不同的操作系统上,包括 Linux、Max OS X、Windows、Android 和 iOS 等,从 x86 架构到 ARM 架构,从拥有单个或多个 CPU 的服务器到大规模 GPU 集群,凭借着统一的架构,可以跨越多种平台部署,显著地降低了机器学习系统的应用部署难度,易用性得到了很大程度的提升。

TensorFlow 从 1.x 到 2.0 的变化

TensorFlow2.0 在 1.x 的基础上做了重新设计,重点放在了提升开发人员的工作效率上,确保 2.0 版本更加简单易用。TensorFlow2.0 为了提升易用性做了很多改进,例如对 API 做了精简,删除了冗余的 API,使得 API 更加一致(例如统一 TensorFlow 和 tf.keras 的循环神经网络和优化器等),以及由静态计算图转变为动态计算图等(这使得代码的编写和调试变得更加容易)。

接下来看看  TensorFlow2.0 的主要变化。

1) API精简

很多 TensorFlow1.x 的 API 在 2.0 中被去掉或者改变了位置,还有一些则被新的 API 给替换掉了。官方提供了一个转换工具,可以用来将 1.x 版本的代码升级到 2.0,其主要工作其实就是修改这些有变更的 API。不过使用该工具不一定能够转换成功,转换成功后的代码也并不一定能够正常运行,很多时候还是需要人工修改。

2) 动态计算图

动态计算图(Eager Execution)是 TensorFlow 从 1.8 版开始正式加入的,但只是作为一种可选操作,在 TensorFlow2.0 之前,TensorFlow 默认的模式都是静态计算图机制(Graph Execution),TensorFlow2.0 将动态计算图设为默认模式。

在该模式下用户能够更轻松地编写和调试代码,可以使用原生的 Python 控制语句,大大降低学习和使用 TensorFlow 的门槛。在 TensorFlow2.0 中,图(Graph)和会话(Session)都变成了底层实现,而不再需要用户关心了。

3) 取消全局变量

TensorFlow1.x 非常依赖隐式全局命名空间。当我们调用“tf.Variable”创建变量时,该变量就会被放进默认的图中,即使我们忘记了指向它的 Python 变量,它也会留在那里。当我们想恢复这些变量时,必须知道该变量的名称。

如果没法控制这些变量的创建,也就无法做到这点。TensorFlow1.x 中有各种机制旨在帮助用户再次找到他们所创建的变量,而在 2.0 版中则取消了所有这些机制,支持默认机制:跟踪变量。当我们不再用到某个变量时,该变量就会被自动回收。

4) 使用函数而不是会话

在 TensorFlow1.x 中,使用“session.run()”方法执行计算图,“session.run()”方法的调用类似于函数调用:指定输入数据和调用的方法,最后返回输出结果。为了保留静态图的优势,如性能优化及重用模块化的 TensorFlow 函数等,在 TensorFlow2.0 中,我们可以使用“tf.function()”来修饰 Python 函数以将其标记为即时(Just-In-Time)编译,从而 TensorFlow 可以将其作为单个图来执行。