深度学习和Keras 简介

随着近年来人工智能(AI)技术的大热,相信读者们对“人工智能”“机器学习”
和“深度学习”这几个词汇已经耳熟能详。那么,这三者之间是什么关系呢?从
概念上,可以说机器学习是人工智能的一个子集,而深度学习又是机器学习的一
个子集。机器学习是人工智能的一种实现——使计算机算法能够通过解析数据发
现其中的模式,从而优化自身性能。深度学习又是机器学习的一种实现——在本
书范围内,我们可以说深度学习就是以深度神经网络为核心的机器学习。
Keras 是当前广受欢迎的一种深度学习框架,它提供了关于深度学习的高层
API——所谓“高层”,就是通过对底层具体运算操作进行封装,提高API 的易用
性和扩展性,从而能够高效开发出简洁明快的深度学习代码。因此,对于深度学
习初学者来说,Keras 无疑是十分友好的——尤其相对于TensorFlow 而言。
当然,作为“高层”框架,Keras 本身并不具备底层运算能力,它需要后端模
块提供这些支持——譬如实践中最常用的TensorFlow。实际上,TensorFlow 已经
集成了Keras 模块(尽管跟原生Keras 存在区别),而且在TensorFlow 最新版本中,
Keras 的“戏份”也越来越重,甚至招致部分对Keras“不感冒”的开发者的抗议
——当然这也反映出Keras 的热度。
本书作者Jojo Moolayil 是人工智能、深度学习、机器学习和决策科学领域的
专家。本书首先要介绍深度学习,通过对“底层”和“高层”深度学习框架进行
分析,引出Keras 主题;随后介绍Keras 的安装配置、实际操作、基于Keras 的深度
神经网络开发与应用、深度神经网络的部署与调优等;最后讨论深度学习的最前
沿应用与未来发展。

本文节选自《Keras深度神经网络》一书

-------------------------------------------------------图书基本信息-----------------------------------------------

书名:《Keras深度神经网络》

ISBN:9787302551638

定价:49.8元

出版时间:2020年5月

---------------------------------------------------------试读样章-----------------------------------------------------------

第1 章
深度学习和Keras 简介
本章将简要介绍深度学习(Deep Learning,DL)领域,并讨论几种流行的深度
学习开发框架。本章还将仔细探究Keras 框架的生态系统,分析它为何与众不同,
并通过呈现一段示例代码,让你体会使用该框架开发深度学习模型有多么简易。
让我们开始学习吧。
1.1 深度学习简介
我们首先介绍深度学习的正式定义,然后采用一种简单易懂的方式描述该
主题。
深度学习(DL)是人工智能(AI)中机器学习(Machine Learning,ML)的一个子领
域,它研究由大脑的生物结构和功能启发的算法,以改进智能计算机。
该定义或许太过晦涩,不太好理解,所以下面逐步进行分解说明。在该定义
中可看到三个按特定顺序排列的重要术语:深度学习(DL)、机器学习(ML)和人工
智能(AI)。首先从人工智能开始分别介绍这些流行术语。
1.1.1 揭开流行术语的神秘面纱
可将“人工智能”的最通用形式定义为引入机器的智能的质量。机器通常是
“愚蠢”的,为使它们更聪明,向其中引入某种类型的智能,使得它们可以独立地

做出决策。例如可确定适当的用水量以及浸泡、洗涤和甩干时间的洗衣机。也就
是说,它可根据提供的特定输入做出决策,因此以一种更智能的方式工作。同样,
ATM 机可以正确组合使用机器中各种面额的钞票,满足客户的取款额要求。从技
术角度看,这种智能是以人工方式引入机器中的,因此称为人工智能。
另外需要注意的一点是,这里提到的智能是显式程序化(explicitly programmed)
的,即一个由if-else 规则构成的完全列表。设计系统的工程师仔细考虑所有可能
的规则组合,并设计一个基于规则的系统,该系统可通过遍历已定义的规则路径
来做出决策。如果需要在机器中引入智能而不应用显式编程,能否让机器自行学
习?此时就涉及机器学习问题。
机器学习可以定义为不应用显式编程而将智能引入系统或机器的过程。
——Andrew NG,斯坦福大学兼职教授
机器学习的示例可以是这样一个系统,它通过学习以往的考试成绩和学生的
某些属性,来预测学生能否通过考试。在此,并没有在系统中编入一个判别学生
能否通过考试的所有可能规则的完整列表;与之相反,系统根据从历史数据中获
知的模式自行学习。
那么,深度学习对该情况有何意义?虽然机器学习对于大量问题非常有效,
但在某些对于人类来说非常容易的特定场景中却表现不佳,如将图像分类为猫或
狗,或区分音频剪辑为男声还是女声等。机器学习在图像和其他非结构化数据类
型上表现不佳。通过研究这种不良表现的原因,启发了模仿人类大脑工作过程的
思路,这个过程由数十亿个相互连接、协调工作的神经元组成,以适应学习新事
物。与之并行的神经网络虽然成为研究主题已有多年,但由于当时计算和数据方
面的限制,仅取得有限的进展。当研究人员触及机器学习和神经网络的交界处时,
深度学习领域就诞生了。它是通过开发深度神经网络(DNN),即层数大大增加的
临时性神经网络构建的。深度学习擅长求解机器学习难以适用的新领域。此后,
进一步的研究和实验表明,只要有充裕的可用数据,所有机器学习求解任务均可
用深度学习技术求解,并可预期获得更好的性能。因此,深度学习成为一个解决
预测问题的普适性领域,而不仅局限于计算机视觉、语音等领域。

今天,可利用深度学习求解几乎所有之前使用机器学习解决的案例,并可期
望获得比之前更好的效果,前提是数据充裕。这种实际情况导致可基于数据来区
分两种方法的使用顺序。人们建立了一条新的经验法则:在训练数据的数量超过
某个阈值后,机器学习无法通过增加训练数据量来提高性能,而深度学习能更有
效地利用充裕的数据来提高性能。多年前,统计模型和机器学习之间的争论也遵
循同样的法则。图1.1 表示上述三个领域的模型性能与数据量大小间关系的总体
情况。

图1.1
现在,如果我们重新审视前面提到的正式定义,即可更好地理解其中的陈述:
人工智能的“机器学习”子领域受人类大脑生物学概念所启发。可以使用简单的
维恩图概括这三个领域,如图1.2 所示。
总之,我们可以说,人工智能是采用人工方式将智能引入机器或系统的领域,
无论有无显式编程。机器学习是人工智能的一个子领域,其中智能的引入不需要
显式编程。最后,深度学习是机器学习中的一个领域,其中智能的引入不需要显
式编程,并且使用的算法由人类大脑的生物机理启发。


总之,我们可以说,人工智能是采用人工方式将智能引入机器或系统的领域,
无论有无显式编程。机器学习是人工智能的一个子领域,其中智能的引入不需要
显式编程。最后,深度学习是机器学习中的一个领域,其中智能的引入不需要显
式编程,并且使用的算法由人类大脑的生物机理启发。1.1.2 深度学习可求解当今世界中的哪些经典问题
在当今的数字化世界中,我们可以看到深度学习在各种日常生活方面的应用。
如果你在社交媒体上活跃,可能已经注意到Facebook 在你上传图片时对标记好友
的建议。另请注意特斯拉汽车中的自动驾驶模式,iOS 或Android 手机中消息系
统的下一单词预测,Alexa、Siri 和Google 助手模拟人类来响应询问,等等。在当
今世界中应用的几乎任何系统中,都已经可以见证深度学习的强大能力。
1.1.3 深度学习模型分解
深度学习模型的最基本形式是使用神经网络架构设计的。神经网络是一个相
互连接的神经元(类似于大脑中的神经元)的层次化组织。这些神经元基于所接收
的输入信息将消息或信号传递给其他神经元,并形成利用某种反馈机制进行学习
的复杂网络。
图1.3 是基本神经网络的简化表示。
如图1.3 所示,输入数据由第一个隐含层中的神经元“消费”,然后向下一层
提供输出,以此类推,最终产生输出结果。每一层可拥有一个或多个神经元,并
且其中每个神经元都将计算一个“小”函数(例如激活函数)。前后层两个神经元
之间的连接将具有关联权重。关联权重定义了输入对下一神经元输出的影响,并
最终影响整个输出结果。在神经网络中,在模型训练期间权重初始值都是随机设

置的,但是这些权重被迭代更新以进行学习,从而预测正确的输出。分解神经网
络,可以定义几个基本逻辑模块,如神经元、层、权重、输入、输出、神经元内
部用于计算学习过程的激活函数等。
 

图1.3
为便于你直观理解,这里举一个例子,说明人类大脑如何通过学习来识别不
同的人。当你第二次遇到一个人时,就能认出他。这是怎么发生的?人们在整体
结构上有相似之处:两只眼睛、两个耳朵、一个鼻子、一张嘴等。每个人都有相
同的结构,但我们能够很容易区分人,对吗?
大脑学习过程的本质非常直观。大脑不是通过学习面部的结构来识别人,而
是学习与一般面部的偏差(例如,个体的眼睛与参考眼睛的差别程度),然后可以
将其量化为具有特定强度的电信号。类似地,大脑学习面部所有部分与某个参考
值的偏差,将这些偏差组合成新的维度,并最后给出输出。所有这一切都发生得
如此之快,以至于我们都没有意识到我们的潜意识实际上已经做了些什么。
类似地,展示的神经网络试图使用数学方法模拟相同的过程。输入被第一层
中的神经元“消费”,并且在每个神经元内计算激活函数。基于一个简单规则,
将输出传递到下一神经元,类似人类大脑学习到的偏差。神经元的输出越大,输
入维度的显著性就越强。然后将这些维度组合在下一层中,以形成另外的新维度,
这些维度可能是我们无法理解的。但是系统凭“直觉”了解它。当多次重复该步

骤时,该过程将发展出具有多个连接的复杂网络。
上文说明了神经网络的结构,接下来介绍原理。当我们将输入数据提供给已
定义的结构时,最终输出将是一个预测值,它可能是正确的,也可能是不正确的。
基于该输出,如果通过使用某种方法获得更好的预测,从而向神经网络提供反馈
以改善其适配程度,则系统就能通过更新某些连接上的权重进行学习。为以正确
方式实现提供反馈和更改神经网络的后续步骤,我们使用一种称为“反向传播”
的美妙数学算法。逐步迭代该过程多次,随着数据越来越多,有助于神经网络正
确地更新权重,从而创建一个系统,该系统可以基于自身通过权重和连接创建的
规则,做出预测输出的决策。
之所以得名“深度神经网络”,是因为其中使用了较多的隐含层,使其成为一
个用于学习更复杂模式的“深层”网络。近几年来才涌现一些深度学习的成功案
例,因为训练神经网络的过程计算量很大,并且需要大量数据。只有当计算机和
数据存储变得更为普及、廉价时,这种实验才最终出现了曙光。
1.2 探索流行的深度学习框架
鉴于深度学习的应用以惊人的速度发展,其生态系统的成熟性也显著改善。
感谢许多大型技术组织和开源计划,我们现在有很多产品可供选择。在深入研究
各种框架的细节前,有必要先搞懂为什么必须有一个框架,以及有哪些框架可用
作备选。
我们首先来了解软件行业中框架的演变过程。
如果观察软件行业的发展,会明白如今开发高端软件要比几年前容易得多。
这要归功于那些能以某种简单易用方式自动求解或抽象化复杂问题的工具。技术
界一直充满善意、富于创新,贡献了诸多伟大创意。我们基于先前的服务构建一
些新服务,并将最终创建出一个复杂服务,该复杂服务能够对服务集进行编排运
用,且兼顾安全性和可扩展性。目前可用软件工具的成熟度已足够使我们得以抽
象几种后台复杂性。这些工具仅仅是软件系统的基本模块。从技术角度看,不
需要从头开始,而依靠可用的已高度成熟的强大工具,即可处理多种软件构建

服务。
类似地,在深度学习中,存在一些代码块,可重用于不同类型的用例。既然
具有不同参数值的相同算法可用于不同的用例,那么为什么不将该算法打包为一
个简单的函数或类?深度学习的多个方面算法已经被开发为可直接在一些框架中
调用的可重用代码,这些框架很好地抽象化了算法的理念。深度学习模型中的基
本模块包括神经元、激活函数、优化算法、数据增强工具(数据增强工具主要用来
防止过拟合)等。用户确实可以从0 开始(例如使用C++、Java 或Python 语言)开发
深度神经网络,代码大约有1000 行,也可使用某种框架并重用一些可利用的工具,
此时代码可能仅有10~15 行。既然如此,接下来就介绍几种当今业界使用的流行
深度学习框架。
1.2.1 低级深度学习框架
按照某个框架所提供的抽象级别,可将其分类为低级或高级深度学习框架。
虽然这绝不是一个业界认可的术语,但可以使用这种划分以便更直观地理解框架。
以下是几种流行的深度学习初级框架。
1. Theano
Theano 是最早获得人们青睐的深度学习库之一。它由蒙特利尔大学的蒙特利
尔学习算法研究所(Montreal Institute for Learning Algorithms,MILA)开发。Theano
是一种开源Python 库,于2007 年推出,最新的一个主版本于2017 年底由MILA
发布。
其他详细信息,请访问:
http://deeplearning.net/software/theano/
https://github.com/Theano/Theano/
2. Torch
Torch 是基于Lua 编程语言的另一种流行机器学习和深度学习框架。它最初
由Ronan Collobert、Koray Kavukcuoglu 和Clement Farabet 开发,但后来由Facebook
用一组扩展模块改进,并作为开源软件发布。

其他详细信息,请访问:
http://torch.ch/
3. PyTorch
PyTorch 是一种基于Python 语言的开源机器学习和深度学习库,由Facebook
AI 研究团队开发。PyTorch 比Torch 更受欢迎,因为任何对Python 有基本了解的
人都可以开展深度学习模型开发。此外,使用PyTorch 进行深度学习开发,要容
易和透明得多。
其他详细信息,请访问:
https://pytorch.org/
4. MxNet
MxNet 的发音为mix-net,代表“混合(mix)”和“最大化(maximize)”,由卡
内基梅隆大学、纽约大学、新加坡国立大学、麻省理工学院等单位的研究人员开
发。简而言之,其思想是将声明式编程和命令式编程结合在一起(混合),以最大
限度提高效率和产出率。它支持使用多GPU,并得到AWS 和Azure 等主要云提
供商的大力支持。
其他详细信息,请访问:
https://mxnet.apache.org/
5. TensorFlow
TensorFlow 无疑是深度学习界最受欢迎、最广泛使用的深度学习框架之一。
它由Google 开发并开源,支持跨CPU、GPU 以及移动和边缘设备部署。它于2015
年11 月发布,随后应用量大幅增加。
www.tensorflow.org/
深度学习框架种类繁多,讨论所有这些框架超出了本书的范畴。读者可以另
外研究的其他一些流行框架包括Caffe、Microsoft CNTK、Chainer、PaddlePaddle
等。讨论一种框架与其他框架谁优谁劣,是另一种有趣且永无止境的辩论。笔者
强烈建议读者探索并了解每种框架提供的改进之处。

下面的链接将是很好的起点:
https://blogs.technet.microsoft.com/machinelearning/2018/03/14/comparing
-deeplearning-frameworks-a-rosetta-stone-approach/
1.2.2 高级深度学习框架
前面提到的一些框架可以定义为深度学习模型的第一级抽象。开发人员仍然
需要编写相当长的代码和脚本来实现深度学习模型,尽管比直接使用Python 或
C++开发要少得多。使用第一级抽象的优点在于设计模型时提供的灵活性。
但为了简化深度学习模型的开发过程,可以使用一些位于第二级抽象的框架;
也就是说,可使用现有框架之上的新框架(即新框架基于现有框架开发),从而进
一步简化深度学习模型开发,而不是直接使用前面提到的框架。
最流行的高级深度学习框架是Keras,它提供了深度学习模型开发的第二级抽
象。也可以使用Gluon、Lasagne 等其他框架,但Keras 是其中应用最广泛的一种。
Gluon 运行在MxNet 之上,Lasagne 运行在Theano 之上,而Keras 可运
行在TensorFlow、Theano、MxNet 和Microsoft CNTK 之上。Keras 支持的底
层框架列表一直在积极扩展,很可能在读者读到本书时,又会添加更多的其
他框架。
Keras 是一种用Python 语言编写的高级神经网络API,可帮助用户用不到15
行的代码就开发出一个功能齐备的深度学习模型。由于它是用Python 语言编写的,
因此拥有较大的用户和支持者社区,并且非常容易上手。Keras 的简便性在于它可
以帮助用户快速开发深度学习模型,在提供较大灵活性的同时,仍然属于一种高
级API。这实际上使得Keras 成为一种特殊框架。此外,由于它支持其他一些框
架作为后端,因而增加了灵活性。可根据需要针对不同的用例使用不同的初级
API。到目前为止,最常用的Keras 运用方式是将TensorFlow 作为后端(将Keras
作为高级深度学习API,将TensorFlow 作为初级API 后端)。简而言之,用户使用
Keras 编写的代码将被转换为TensorFlow,然后在一个计算实例上运行。
可从https://keras.io/阅读更多关于Keras 及其最新发展状况的信息。

1.3 初步了解Keras 框架
上文已经介绍了可用于深度学习的不同框架,以及使用框架的必要性,在结
束本章之前,我们初步了解一下,为什么Keras 在深度学习开发中具有压倒性优
势。在下一章中,当然会深入介绍Keras 提供的功能,但在本章结束之前,窥探
一下Keras 之美也是很有趣的。
请看图1.4 所示的深度神经网络。

是的,这正是1.1.3 节中的图1.3。如果尝试描述该网络,可以说它是一个深
度神经网络,该网络具有两个隐含层,这两个隐含层分别有五个和四个神经元。
第一个隐含层接收具有三个维度的输入数据,并在具有两个神经元的输出层中提
供输出。
为了更直观地加以说明,可以假设这是一个简单的深度神经网络,用于基于
某些输入数据预测学生能否通过考试。
假设将某人的年龄、小时数表示的学习时间,以及他之前100 次考试的平均
分数,作为输入数据点。
利用Keras 构建的神经网络就像下面的脚本一样简单。目前不理解下面代码

的含义绝对不是什么问题,我们将在第2 章中详细分析该代码。
#Import required packages
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
# Getting the data ready
# Generate train dummy data for 1000 Students and dummy test
for 500
#Columns :Age, Hours of Study &Avg Previous test scores
np.random.seed(2018). #Setting seed for reproducibility
train_data, test_data = np.random.random((1000, 3)), np.random.
random((500, 3))
#Generate dummy results for 1000 students : Whether Passed (1)
or Failed (0)
labels = np.random.randint(2, size=(1000, 1))
#Defining the model structure with the required layers, # of
neurons, activation function and optimizers
model = Sequential()
model.add(Dense(5, input_dim=3, activation='relu'))
model.add(Dense(4, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['accuracy'])
#Train the model and make predictions
model.fit(train_data, labels, epochs=10, batch_size=32)
#Make predictions from the trained model
predictions = model.predict(test_data)
上述代码可分为三个部分。
1.3.1 准备数据
通常,我们会花一些时间来预处理数据,方法是导入和浏览数据内容,并对
输入模型的数据进行必要的增强。由于此处是一个模拟用例,因此只是使用Python
的numpy 包中的随机数生成器,创建一个1000 名学生的模拟训练数据集,还有另
一个500 名学生的模拟测试数据集,以及学生的标签或实际输出(即他们是否成功
通过考试)。

1.3.2 定义模型结构
根据需要的格式准备好数据后,首先需要设计深度神经网络的结构。我们定
义层的数量和类型、每层中神经元的数量、所需的激活函数、需要使用的优化器,
以及其他几个神经网络属性。
1.3.3 训练模型和预测
定义神经网络后,就可以对模型运用“拟合”方法,使用具有正确预测的训
练数据来训练网络。最后,模型训练完毕后,可使用训练后的模型对新的测试数
据集进行预测。
笔者希望这个例子尽管非常简单,但可以让读者对使用Keras 框架开发深度
学习模型的容易程度有一定认识。如果此时难以理解代码,不是什么大问题。我
们将在下一章中逐步详细分析代码。
1.4 本章小结
在本章中,通过简单介绍,我们了解了深度学习的基础知识,并探讨了在数
字化的日常生活中利用深度学习求解的几种常见问题的例子。然后研究了使用深
度学习框架开发模型的必要性,并探索了业内可用的一些初级框架和高级框架。
最后用一个简单的模拟示例介绍本书的首选框架Keras,展示了利用它创建深度学
习模型的简便性。
在下一章中,将深入了解Keras 及其提供的各种构建模块,将尝试使用Keras
和Python 开发一个简单的深度学习模型。

 

想了解更多关于《Keras深度神经网络》的内容,请点击:https://item.jd.com/12860974.html