《Deep Learning with Python》第三章 3.2 走进神经网络之Keras简单入门

3.2 Keras简单入门

全书使用的代码示例采用Keras(https://keras.io)实现。Keras是一个Python编写的深度学习框架,提供方便的方式定义和训练几乎所有的深度学习模型。Keras原本是为研究者开发的,旨在加速试验。Keras具有以下特色:

  • 同一段代码可以在CPU或者GPU上无缝切换
  • 用户友好的API使得创建深度学习模型的原型更简单
  • 內建支持卷积神经网络(计算机视觉)、循环神经网络(序列处理),以及两者的任意组合
  • 支持任意网络结构:多输入或者多输出模型,layer共享,模型共享,等等。这意味着Keras能构建任意深度学习模型,从对抗生成网络到图灵机。

Keras采用MIT license分发,意味着可以在商业项目中使用。截止到2017年中旬,Keras同时兼容Python 2.7到3.6版本。

Keras已有超过200,000个使用者,涵盖从学术研究到工业企业(包括创业公司和大型公司)。Google、Netflix、Uber、Yelp和成百上千的创业公司使用Keras解决各种问题。Keras也是机器学习竞赛网站Kaggle最流行的使用框架。

image

图 3.2 Google搜索中深度学习框架的关注度趋势

3.2.1 Keras、TensorFlow、Theano和CNTK

Keras提供high-level的开发深度学习模型的构建模块,其是model-level的库。Keras不能解决low-level的操作,比如张量操作和差分。Keras可以依赖指定的、经过优化的张量操作库作为其后端引擎(backend engine),而不是选择一个张量库去试图作为Keras的实现。Keras是以模块化的方式解决问题,见图3.3,不同的后端引擎能够为Keras进行无缝地扩展。当前已经存在三种后端引擎实现:TensorFlow后端引擎,Theano后端引擎,和CNTK后端引擎。将来可能会为Keras扩展更多的深度学习执行引擎。

image

图3.3 深度学习软件和硬件栈

TensorFlow、CNTK和Theano是当前主流的深度学习平台,其中Theano(http://deeplearning.net/software/theano)是蒙特利尔大学大学MILA实验室开发的,TensorFlow(www.tensorflow.org)由谷歌开发,CNTK(https://github.com/Microsoft/CNTK)由微软开发。用Keras编写的代码不用做任何改变即可在这些执行引擎上运行。在深度学习模型开发阶段,使用Keras可以在两种不同的执行引擎之间切换,比如,解决某种任务时,其中某个执行引擎执行会快。我们推荐使用TensorFlow作为深度学习模型的默认执行引擎,因为TensorFlow已经被广泛采纳、扩展,以及产品化。

通过TensorFlow(CNTK或者Theano),Keras能在CPU和GPU上无缝运行。TensorFlow封装low-level的Eigen(http://eigen.tuxfamily.org)张量操作库来运行CPU;封装经过优化的深度学习操作的库,即NVIDIA CUDA神经网络库(cuDNN),来运行GPU。

3.2.2 使用Keras开发:快速预览

你已经看过一个Keras模型的例子:MNIST数字识别的实例。典型的Keras工作流程就像如下的例子:

  1. 定义训练数据集:输入张量和目标张量
  2. 定义layer的网络(或者model):将输入张量映射为目标张量
  3. 配置学习过程:选定损失函数、优化器和监控的一些指标
  4. 迭代训练数据:调用模型的fit()函数在训练数据集上迭代训练

有两种方式定义神经网络模型:使用Sequential类(专为layer的线性逐层连接的模型,截止目前大部分都是此类模型)或者使用函数式API(为有向无环图式layer连接的模型,可以构建任意形式的模型)。

对于新手来讲,下面的例子使用Sequential类定义两层layer的模型(注意,为第一个layer传入指定形状的输入数据):

1
2
3
4
5
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(784,)))
model.add(layers.Dense(10, activation='softmax'))

接着用函数式API定义上述相同的模型:

1
2
3
4
input_tensor = layers.Input(shape=(784,))
x = layers.Dense(32, activation='relu')(input_tensor)
output_tensor = layers.Dense(10, activation='softmax')(x)
model = models.Model(inputs=input_tensor, outputs=output_tensor)

使用函数式API操作模型处理的数据张量,将layer应用于这些张量,就好像它们是函数一样使用。

备注:函数式API的详细使用教程将在第七章介绍。在第七章之前,代码例子会使用Sequential类创建模型。

一旦定义好了模型架构,使用Sequential模型还是函数式API模型都不重要。下面的步骤是相同的。

在编译步骤配置学习过程,指定使用模型的优化器和损失函数,选择训练的监控指标。下面的例子使用单个损失函数:

1
2
3
4
from keras import optimisers
model.compile(optimizer=optimizers.RMSprop(lr=0.001),
loss='use',
metrics=['accuracy'])

最后,为模型传入输入数据和相应的目标数据的Numpy数组,通过fit()函数进行学习过程:

1
model.fit(input_tensor, target_tensor, batch_size=128, epochs=10)

后面几个章节将会帮你建立坚实的直觉:哪类的问题适用哪种网络架构?如何选择正确的学习配置?如何调整模型直到得到想要的结果?下面将会在3.4,3.5和3.6小节介绍三个基本的例子:二分类,多分类和回归。

未完待续。。。

Enjoy!

翻译本书系列的初衷是,觉得其中把深度学习讲解的通俗易懂。不光有实例,也包含作者多年实践对深度学习概念、原理的深度理解。最后说不重要的一点,François Chollet是Keras作者。
声明本资料仅供个人学习交流、研究,禁止用于其他目的。如果喜欢,请购买英文原版。


侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。

若发现以上文章有任何不妥,请联系我。

image