深度学习从0到1
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.1 Tensorflow介绍

5.1.1 Tensorflow简介

Tensorflow的官网是https://tensorflow.google.cn/。

Tensorflow是谷歌基于DisBelief进行研发的第二代人工智能学习系统,并于2015年11月9日开源。Tensorflow可被用于图像识别、语音识别、文本处理等多项机器学习和深度学习领域,并且可以运行在智能手机、个人电脑、数据中心服务器等各种设备上。

目前,支持Windows、MacOS、Linux系统,支持CPU/GPU版本,支持单机和分布式版本。

Tensorflow支持多种编程语言,包括Python、C++、GO、JAVA、R、SWIFT和JavaScript。最主流的编程语言是Python,本书主要介绍的编程语言也是Python。目前Tensorflow支持64位的Python 3.5/3.6/3.7/3.8版本。

2019年3月8日,Google发布最新的Tensorflow2.0-Alpha版本,并在2019年10月1日发布了Tensorflow2.0正式版本。新版本的Tensorflow有很多新特性,更快、更容易使用且更人性化。因为新版本的Tensorflow有较大的更新,所以老版的Tensorflow程序在新版本中几乎都无法继续使用。

如果你是作一个初学者,那么应该先学Tensorflow 1呢?还是直接学习Tensorflow 2?学习Tensorflow 1的理由是现在网上的Tensorflow开源程序,以及比较成熟的Tensorflow项目基本上都是基于Tensorflow 1的,Tensorflow 2刚推出不久,资源相对来说比较少一些。但Tensorflow 2肯定是未来发展的趋势,虽然现在还比较新,但是我还是建议大家以学习Tensorflow 2为主。Tensorflow 1和Tensorflow 2作为两个大的版本,它们之间肯定会有很多不同之处,下面我选取两个我觉得最大的变化来给大家进行说明。

5.1.2 静态图和动态图机制Eager Execution

Tensorflow 1版本跟很多其他的“老”深度学习框架一样,都使用静态图机制。而Tensorflow 2版本跟Pytorch一样,都使用现在最新潮的动态图机制。什么是动态图机制,我觉得基本上不需要跟大家解释,其是一种跟我们平时写Python代码类似的一种机制,用起来很自然。例如,代码5-1为Tensorflow 2的程序。

代码5-1:动态图

运行结果如下:

动态图程序看起来就跟一段普通的Python程序一样。但静态图就没这么好理解了,因为静态图跟我们平时的编程习惯不符。在静态图机制中,我们需要在一个计算图(Graph)中定义计算的流程,然后再创建一个会话(Session),在会话中执行计算图的计算。例如,代码5-2为Tensorflow 1的程序。

代码5-2:静态图(片段1)

运行结果如下:

代码5-2:静态图(片段2)

运行结果如下:

对比动态图和静态图这两个简单的程序,我们能看出还是动态图使用起来比较简单,也更加自然。这也是深度学习框架未来的发展趋势,以后静态图机制应该会被慢慢淘汰。

5.1.3 tf.keras

在说tf.keras之前,我们先来说一下Keras,其是所有深度学习框架中最容易使用的深度学习框架,最初是由Google AI研究人员弗朗索瓦·肖莱(Francois Chollet)创建并开发的。弗朗索瓦于2015年3月27日将Keras的第一个版本发布在他的GitHub。Keras是一个高度封装的深度学习框架,它的后端可以是Theano、Tensorflow或者CNTK。很快,Keras的易用性得到了广大深度学习研究开发者的认可,引起了Tensorflow官方的注意,并从Tensorflow 1.10版本开始加入tf.keras接口,即我们在Tensorflow中也可以使用Keras的方式来搭建和训练模型。

但Keras和tf.keras是分开的两个项目,它们使用起来基本上是一样的,只是在细节上会有一些小的不同。随着Tensorflow 2.0的推出,谷歌宣布Keras现在是Tensorflow的官方高级API,用于快速简单的模型设计和训练,并推荐大家使用。随着Keras 2.3.0的发布,弗朗索瓦也发表声明推荐深度学习从业人员都应该将代码转成Tensorflow 2.0和tf.keras,而不是继续使用Keras。

如何完成我们的深度学习模型训练程序,在Tensorflow 1.0中,我们有非常多选择。Tensorflow 2.0把选择进行了简化,只保留了更好的几种。基于Tensorflow官方推荐,以及我个人的使用经验,我认为在Tensorflow 2.0的使用中,我们可以尽量多使用tf.keras的接口来完成我们的应用。

前面介绍了很多关于Keras/tf.keras的优点,下面说说Keras/tf.keras的缺点,即程序运行效率会比纯Tensorflow程序要稍微慢一点点。这很容易理解,程序封装越多,用起来越方便,运行起来自然就会慢一些。但Tensorflow针对这个问题也做了很多优化,所以实际应用中其实纯Tensorflow和tf.keras速度的差距一般也不会很大。真正影响深度学习运行速度的主要影响因素是模型的复杂度和硬件条件,tf.keras对于速度的影响基本上不会很大。