Python神经网络项目实战

978-7-115-54920-4
作者: 詹姆斯·洛伊(James Loy)
译者: 艾凌风
编辑: 武晓燕

图书目录:

详情

本书主要讲述了神经网络的重要概念和技术,并展示了如何使用Python来解决日常生活中常见的神经网络问题。本书包含了6个神经网络相关的项目,分别是糖尿病预测、出租车费用预测、图像分类、图像降噪、情感分析和人脸识别,这6个项目均是从头开始实现,且使用了不同的神经网络。在每个项目中,本书首先会提出问题,然后介绍解决该问题需要用到的神经网络架构,并给出选择该神经网络模型的原因,最后会使用Python语言从头实现该模型。此外,本书还介绍了机器学习和神经网络的基础知识,以及人工智能未来的发展。

图书摘要

版权信息

书名:Python神经网络项目实战

ISBN:978-7-115-54920-4

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [美] 詹姆斯•洛伊(James Loy)

译    艾凌风

责任编辑 武晓燕

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e54920”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。


Copyright©2022 Packt Publishing. First published in the English language under the title Neural Network Projects with Python.

All rights reserved.

本书由英国Packt Publishing公司授权人民邮电出版社有限公司出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


本书主要讲述了神经网络的重要概念和技术,并展示了如何使用Python来解决日常生活中常见的神经网络问题。本书包含了6个神经网络相关的项目,分别是糖尿病预测、出租车费用预测、图像分类、图像降噪、情感分析和人脸识别,这6个项目均是从头开始实现,且使用了不同的神经网络。在每个项目中,本书首先会提出问题,然后介绍解决该问题需要用到的神经网络架构,并给出选择该神经网络模型的原因,最后会使用Python语言从头实现该模型。此外,本书还介绍了机器学习和神经网络的基础知识,以及人工智能未来的发展。

本书需要读者具备一定的Python编程知识,适合数据科学家、机器学习从业人员以及对神经网络感兴趣的读者阅读。

致我的夫人阿格尼丝•利姆(Agnes Lim) ——我的伙伴、灵魂伴侣和拉拉队长。没有她,这本书是不可能完成的。

——詹姆斯•洛伊(James Loy)


詹姆斯•洛伊(James Loy)是一名数据科学家,他在金融和医疗行业有超过5年的工作经验。他曾在新加坡最大的银行工作,通过预测性分析驱动创新,同时帮助银行提高客户的忠诚度。他也在医疗部门工作过,在那里他通过数据分析来改善医院做出的决断。他在佐治亚理工大学获得了计算机科学硕士学位,研究方向为机器学习。

他关注的研究领域有深度学习和应用机器学习,还包括为工业自动化系统开发基于计算机视觉的人工智能。他经常在Towards Data Science网站上发表文章,这是一个非常著名的机器学习网站,每个月的访问量超过300万人次。


迈克•汤普森(Mike Thompson)在过去的 10 年里做过多个领域(数据工程、服务开发以及分布式系统设计)的软件工程师。

他曾就职于著名游戏厂商Bungie,并负责开发了《命运》系列游戏,包括2014年的《命运》和2017年的《命运2》。他对Bungie后端数据基础设施的扩展功不可没,这使得成千上万的玩家能够玩《命运》这款游戏。

他现在在ProbablyMonsters工作,这是一个初创的游戏工作室。在这里,他专注于数据服务和基础设施,同时也负责一些能够帮助工作室顺利发展的其他必要工作。


机器学习和人工智能(AI)在日常生活中已经变得随处可见了。不论我们在哪儿,不论我们做什么,从某种程度上讲,都会时不时地和人工智能发生关系。而这些AI技术正是由神经网络和深度学习所驱动的。得益于神经网络技术,AI系统现在已经可以在某些领域具有和人类相当的能力了。

本书帮助读者从头构建了6个神经网络项目。通过这些项目,你可以构建一些生活中时常可见的AI系统,包括人脸识别、情感分析以及医疗诊断。在每个项目中,本书首先会提出问题,随后介绍解决该问题需要用到的神经网络架构,同时给出选择该神经网络模型的原因,然后使用Python语言从头实现该系统。

当你读完本书的时候,你已经可以很好地掌握不同的神经网络架构,并通过Python语言实现相关的前沿AI项目,此举可以迅速增强你的机器学习技术能力。

这本书非常适合数据科学家、机器学习工程师以及渴望通过Python创建实际神经网络项目的深度学习爱好者阅读。读者需要具备Python和机器学习的基础知识以便完成本书的练习。

本书共有8章,具体如下。

第1章,机器学习和神经网络导论,包括了机器学习和神经网络的基础知识。第1章的目标是帮助你加强对机器学习和神经网络的理解。为了达到这一目标,本章会使用Python从头构建神经网络而不使用任何机器学习库。

第2章,基于多层感知器预测糖尿病,本章开始介绍第一个神经网络项目。使用一个基础的神经网络(多层感知机)来构建分类器,然后利用它对患者是否有患糖尿病的风险做出预测。

第3章,基于深度前馈网络预测出租车费用,本章将深度前馈神经网络应用到回归问题中。具体来讲,我们会利用神经网络来预测纽约市的出租车费用。

第4章,是猫还是狗——使用卷积神经网络进行图像分类,本章使用卷积神经网络(CNN)来解决图像分类问题,即使用CNN判断图像中是否有猫或狗。

第 5 章,使用自动编码器进行图像降噪,本章利用自动编码器来实现图像降噪。办公文档的图片中包含了咖啡渍或其他污渍,可以使用自动编码器来移除图像中的污渍从而将文件还原。

第 6 章,使用长短期记忆网络进行情感分析,本章使用长短期记忆网络(Long Short-Term Memory,LSTM)对网上的影评进行情感分析和分类。本章会创建一个可以辨别英文文本中所包含的情感的LSTM网络。

第 7 章,基于神经网络实现人脸识别系统,本章利用孪生神经网络(siamese neural network)来构建一个人脸识别系统,该系统可以利用便携式计算机的摄像头识别出我们的脸。

第8章,未来是什么样的。本章总结了本书介绍的知识,同时会展望未来,看看机器学习和人工智能在未来几年会发展到什么程度。

你要熟悉基本的Python编程技能才能最大限度地利用本书。不过,本书也会一步一步地向你介绍各个项目并且尽可能地向你讲解相关代码。

对于计算机硬件,你需要一台计算机,最低配置为8GB内存和15GB硬盘(存放数据集)。训练深度神经网络需要强大的计算资源,如果你有一个专用的GPU设备,将能极大地提高其训练速度。不过,没有GPU也是完全可以运行代码的(比如说用一台便携式计算机)。运行特定代码时如果你没有GPU会花费很长时间,此时我们会给出相应的提示,这一点会贯穿全书。

在每一章开始的地方,我们会提示你本章所需的必要的Python库。为了简化搭建开发环境的过程,我们准备了一个environment.yml文件和代码一起提供给你。environment.yml文件可以帮助你快速创建虚拟环境,其中包含特定的Python版本以及所需的库。通过这种方法,你可以确保你的代码在一个设计好的、标准的虚拟环境中执行。详细的指导会在第1章中提供,你可以在1.2节中找到,此外在每个章节的开始处也会有相应介绍。

你可以从Packt官方网站下载示例代码文件。如果你在其他地方购买本书,你可以访问Packt官网并注册,网站会将文件直接通过邮件发送给你。

可以按照以下步骤下载代码文件。

(1)使用邮箱和密码登录。

(2)单击页面顶部的支持(SUPPORT)标签。

(3)单击代码下载及勘误表(Code Downloads & Errata)。

(4)在搜索(Search)框里输入书名。

(5)选择你想要下载代码文件的图书。

(6)从你付款的地方选择下拉菜单。

(7)单击代码下载(Code Download)。

下载文件后,请确保使用最新版本的软件来解压或提取这些文件夹:

Windows上的WinRAR/7-Zip;

Mac上的Zipeg/iZip/UnRarX;

Linux上的7-Zip/PeaZip。

本书的代码包托管在异步社区(www.epubit.com)对应的图书页面以及GitHub上。

我们还提供了一个压缩文件,其中包含本书使用的截图或图表的彩色图像。这些彩色图像可以帮助你更好地了解输出的变化。你可以从异步社区下载该文件。


本书由异步社区出品,社区(https://www.epubit.com)为您提供相关资源和后续服务。

您还可以扫码右侧二维码, 关注【异步社区】微信公众号,回复“e54920”直接获取,同时可以获得异步社区15天VIP会员卡,近千本电子书免费畅读。

本书提供如下资源:

本书源代码;

本书彩图文件。

要获得以上配套资源,请在异步社区本书页面中单击 ,跳转到下载界面,按提示进行操作即可。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

扫描下方二维码,您将会在异步社区微信服务号中看到本书信息及相关的服务提示。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit. com/selfpublish/submission即可)。

如果您来自学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


近些年来,人工智能(AI)非常夺人眼球。从手机上的人脸识别解锁到通过Alexa预约一辆优步,AI在我们的日常生活中已经变得随处可见。不仅如此,我们还常常被告知AI的全部实力还没有被发挥出来,而且AI将会是我们生活中最大的变革因素。

放眼望去,我们看到的是不断进步的人工智能以及它对改善我们生活的“承诺”。基于AI技术,无人驾驶汽车已经从科幻走进现实。无人驾驶汽车意在减少由于人类疏忽造成的交通事故并极大地改善我们的生活。同样,在医疗中使用AI技术可以提高治疗效果。值得注意的是,英国国民健康医疗服务体系宣布了一项雄心勃勃的AI项目,该项目可用于进行早期癌症的诊断,此举可能挽救无数人的生命。

由于AI技术本身的变革性,所以很多专家将其称为第四次工业革命。AI将成为重塑现代工业的催化剂,人工智能是新世界的必修课。读完本书,你将能够很好地理解人工智能背后的算法,同时利用这些先进的算法开发出真实的项目。

本章包括以下内容:

机器学习和人工智能简介;

在你的计算机上搭建机器学习开发环境;

基于机器学习工作流执行你的机器学习项目;

不使用任何机器学习相关的Python库,从头实现你自己的神经网络;

使用pandas进行数据分析;

利用Keras等机器学习库构建强大的神经网络。

虽然机器学习和人工智能这两个词经常被互换使用,但它们其实并不是完全一样的。人工智能这个词最早出现在20世纪50年代,它指的是机器模仿人类行为的能力。为此,研究人员和计算机科学家尝试了很多方法。早期,人们主要利用的技术叫作符号人工智能。符号人工智能试图将人类的知识声明为一种计算机可以处理的形式。基于符号,人工智能诞生了专家系统。这种计算机系统可以模拟人类的决策,然而,符号人工智能最大的缺点是它依赖于人类专家的知识,并且为了解决特定的问题,这些规则和认知是被编程的。由于符号人工智能的能力所限,科学家对其越来越不抱有希望,因此人工智能作为一个科学领域,曾经经历过一段时间的低谷(被称为AI的冬天)。当符号人工智能在20世纪50年代占据舞台中心的时候,人工智能的另外一个子领域——机器学习,正在后面悄悄地进步着。

机器学习指的是一类算法,这类算法可以使计算机能够从数据中学习并对未来遇到的未知数据集做出预测。

然而,早期的人工智能研究人员并没有特别关注机器学习,因为那时候的计算机算力不强,同时也没有存储海量数据的能力,而这些正是机器学习算法所必需的。后来人们发现,机器学习不能再被忽视了。21世纪初,得益于机器学习的发展,人工智能经历了一轮复兴。这轮复兴的关键原因是计算机系统的成熟使其可以收集并存储海量数据(大数据),同时处理器变得足够快,能够运行机器学习算法。人工智能迎来了它的春天。

既然谈到了什么是机器学习,那么我们需要明白机器学习算法是如何工作的。机器学习算法可以被大致分为两类。

有监督学习:通过标记过的训练数据,机器学习算法学习将输入变量映射到目标变量的规则。例如,某监督学习算法学习预测是否会有降雨(目标变量),它的输入是温度、时间、季节大气压(输入变量)等。

无监督学习:使用未经标记的训练数据,机器学习算法学习数据的关联规则。无监督学习最常见的使用案例是聚类分析。在聚类分析中,机器学习算法识别数据中隐藏的模式和类别,而此数据并没有事先被明确标记过。

在本书中,我们专注于有监督学习算法。举一个有监督学习的具体例子,请考虑如下问题。你是一个动物爱好者,同时也是一个机器学习爱好者,因此你希望创建一个有监督机器学习算法来判断一个动物是友善的(友善的小狗)还是具有敌意的(危险的熊)。为了简化问题,假设你收集了各品种的狗和熊的两种测量特征——体重和速度。数据(训练数据集)收集完成后,你将数据绘制在图表中,同时标记每个动物是敌是友,如图1-1所示。

图1-1

结果很明显,我们发现狗的体重较轻,速度一般也较快。而熊则更重一些,速度也更慢一些。如果我们在狗和熊之间画一条线(即决策边界),那么我们可以利用这条线进行预测,如图1-2所示。一旦我们得到了某个新的动物的测量数据,就可以通过观察它落在这条线的左侧还是右侧来进行预测。落在左侧则是友善的,落在右侧则是有敌意的。但是这个数据集的维度很少。如果可以收集成百上千的不同的测量维度呢?这样的话,图表可能会有100多维,通过人工的方式很难画出这条决策边界。不过,对于机器学习来说,这并不是什么难题,机器学习算法的任务就是优化决策边界并以此分割数据集。在理想的情况下,我们希望算法能够生成一条决策边界,完美地分割数据集中的两类数据(尽管,取决于不同的数据集,这件事并不总能成功)。

图1-2

有了这条决策边界,我们可以对新的未经标记的数据进行预测。如果新数据落在决策边界的左侧,我们将其归类为友善的动物;反之,如果新数据落在决策边界的右侧,我们将其归类为有敌意的动物。

对于上面这个简单的例子,我们仅接收两个输入变量并将数据分为两组。我们可以把这个问题泛化,有多个输入并分为多个种类。

当然,我们对于机器学习算法的选择会影响生成的决策边界。一些流行的有监督机器学习包括如下几种:

神经网络(neural network);

线性回归(linear regression);

对数概率回归(logistic regression);

支持向量机(SVM);

决策树(decision tree)。

数据集的属性(例如图像数据集和数值数据集)和要解决的问题决定了我们所选的机器学习算法。在本书中,我们专注于神经网络。

我们已经探讨了什么是机器学习。但是要如何开始机器学习呢?从宏观的角度来看,机器学习项目就是将原始数据作为输入并做出预测然后输出。在达到这一目的之前,还有很多中间步骤需要完成。机器学习工作流可以用图1-3来概括。

图1-3

机器学习工作流的输入始终是数据。数据可以有不同的来源,格式也可以不同。例如,如果我们在做一个基于计算机视觉的项目,它的输入可能是图像。对于其他大多数的机器学习项目,数据会以表格的形式呈现,类似电子表格。对于某些项目而言,收集数据是非常重要的第一个步骤。在本书中,假设所有的数据已经提供,我们可以专注于机器学习。

下一步是处理数据。原始数据通常非常杂乱、易错并且可能不适合我们选择的机器学习算法。如果数据有多个来源,我们还需要将多个数据集合并为一个数据集。机器学习模型为了进行学习,通常需要一个数值化的数据集。如果原始数据集中有多个类别变量(例如性别、国家、星期等),则需要对这些变量进行数值编码。我们会在本章后面的部分学习如何去做。对于特定的机器学习算法,数据换算和标准化也是必要的。这么做的逻辑是,如果某些变量的范围远大于另外一些变量,那么机器学习算法会错误地重点关注这些变量。

现实中的数据集往往非常杂乱,你会发现有些数据集是不完整的,同时行或列中有些数据是缺失的。处理缺失数据有相应的方法,每种方法都有它的优点和缺点。最简单的方法是丢弃含有缺失数据的行或列。但是这个方法可能并不适用于所有情况,因为这样做的话最后可能数据集的一大部分都被丢弃了。我们也可以用变量的均值来替换这些丢失的数据(如果变量恰巧是数值形式的话)。这个方法更加理想,因为它保护了我们的数据集。但是,使用均值来替换缺失数据会影响到数据集的分布,这可能会对我们的机器学习模型产生负面的影响。另外一个办法是基于存在的数据来预测缺失的数据。但是使用这个方法的时候要小心,因为这样会增加数据集的误差。

最后是数据预处理,我们必须将数据集分成训练数据集和验证数据集两部分。我们的机器学习模型仅仅利用训练数据集来训练和拟合。当我们对模型的性能感到满意之后,我们会通过训练数据集来评估模型。注意我们的模型不曾利用测试数据集训练过,这就保证了我们对模型性能的评估是不含偏差的,这样能够反映模型在真实项目上的表现。

当数据处理完成之后,我们会进行探索性数据分析(EDA),EDA是一个利用数据可视化来洞察数据的过程。EDA允许我们创建新的特征(成为特征工程)并且将领域知识加到机器学习模型中。

最后,我们来到了机器学习的核心部分。在数据处理和探索性数据分析完成后,我们开始建模。正如之前提到的,有一些机器学习算法可供我们选择,并且我们要基于所要解决的问题的特点来选择机器学习算法。在本书中,我们专注于神经网络。在建模过程中,超参数的调优是一个必要的步骤,合适的超参数可以明显提高模型的性能。在后面的章节中,我们会探索神经网络的一些超参数。一旦模型训练完成,我们便可以利用测试数据集对模型的性能进行评估。

可以看到机器学习工作流包含了很多中间步骤,每个步骤都会对模型的整体性能产生影响。使用Python进行机器学习最大的优势在于机器学习工作的全部流程都可以通过利用一些开源的Python函数库来完成。在本书中,我们可以学到Python在机器学习工作流的每一步中的相应经验,因为我们会利用Python从头开始构建一个完整且复杂的神经网络项目。

在深入学习神经网络和机器学习之前,请确保你已经在你的计算机上配置了正确的机器学习环境,这样你才能顺利地运行书中的代码。在本书中,我们会使用Python语言完成多个神经网络项目。除了Python本身,我们还需要一些Python库,例如Keras、pandas、NumPy等。安装Python和库的方法有很多,但是最简便的是使用Anaconda。

Anaconda是一个免费且开源的Python及其函数库的发行版。Anaconda提供了易用的包管理工具,利用这个包管理工具你可以方便地安装Python以及我们需要的全部函数库。安装Anaconda很简单,请访问Anaconda官网并下载安装包(选择Python 3.x安装包)。

除了Anaconda,我们还需要Git。Git对于机器学习和软件工程来说是必要的工具。Git可以帮助我们从GitHub上方便地下载代码,GitHub是世界上使用非常广泛的代码托管平台。你可以根据你的操作系统下载对应的安装包并进行安装。

Anaconda和Git安装完成之后,我们就可以下载本书的示例代码了。本书中的代码都可以在我们的GitHub代码仓库或异步社区中找到。

如果要下载代码,请在命令行(如果你使用macOS/Linux系统,请使用终端工具;如果你使用Windows系统,请使用Anaconda Command Prompt)中使用git clone命令将托管在GitHub上的代码仓库PacktPublishing/Neural-Network-Projects-with-Python下载到本地。

这一步完成之后,执行下面的命令来进入你刚才下载的文件夹:

$ cd Neural-Network-Projects-with-Python

在该文件夹目录下,你会找到一个名为environment.yml的文件。通过这个文件,我们可以把Python以及所需的全部函数库安装到虚拟环境中。你可以把虚拟环境看作一个隔离的沙盒环境,在那里可以安装全新的Python和所需的全部函数库。environment.yml文件包含了一系列指令用于控制Anaconda把特定版本的函数库安装到虚拟环境中。这么做保证了Python代码可以在设计好的标准环境中执行。

通过Anaconda和environment.yml文件来下载函数库,只需要执行下列命令:

$ conda env create -f environment.yml

这样,Anaconda就会把需要的软件包都安装到neural-network-projects- python虚拟环境中。进入这个虚拟环境需要执行下面的命令:

$ conda activate neural-network-projects-python

就是这样!我们现在已经进入了一个安装有所需的全部依赖软件包的虚拟环境。在这个环境中执行Python文件,你需要执行类似于下面的命令:

$ python Chapter01\keras_chapter1.py

如果要退出虚拟环境,可以执行下面的命令:

$ conda deactivate

需要注意的是,当你要执行任何我们提供的Python代码时,都需要先进入虚拟环境(通过执行conda activate neural-network-projects-python)。

现在,开发环境已经配置完成,话题重新回到神经网络。我们将要探索神经网络背后的理论知识以及如何使用Python从头构建一个神经网络。

神经网络是一类机器学习算法,该算法受到了人类大脑中神经元的启发。不过,我们没必要将其完全类比于人类大脑,我发现把神经网络用数学方程描述为将给定输入映射到期望输出,理解起来会更简单。为了理解上述问题,让我们看看单层神经网络是什么样的(单层神经网络也被称为感知器)。

感知器(perceptron)如图1-4所示。

图1-4

它的核心就是一个数学函数,接收一组输入,然后进行某种数学运算,然后将计算结果输出。

    

指的是感知器的权重。我们会在后面的章节中介绍神经网络中的权重。目前我们只需要知道神经网络就是一些简单的数学函数,它们将给定的输入映射为期望的输出。

在开始编写神经网络之前,有必要了解一下神经网络算法能够在机器学习和人工智能领域具有举足轻重的地位的原因。

第一个原因,神经网络是一种通用函数逼近器(universal function approximator)。这句话的意思是,给定任意我们希望建模的函数,不论该函数多么复杂,神经网络总是能够表示该函数。这一特性对神经网络和人工智能具有深远的影响。假设现实中的任何问题都可以被数学函数所表示(不论其多么复杂),那么我们都可以用神经网络来表示该函数,从而有效地对现实世界的问题进行建模。需要补充一点的是,尽管科学家们已经证明了神经网络的通用性,但是一个超大且复杂的神经网络可能永远都无法完成训练及泛化。

第二个原因,神经网络结构的可扩展性非常好而且很灵活。在后续章节中会看到,我们可以将神经网络堆叠起来,以此来增加神经网络的复杂性。更有趣的可能是,神经网络的能力仅仅局限于我们的想象力。通过富有创造性的神经网络结构设计,机器学习工程师已经学会了如何利用神经网络预测时间序列数据(这个模型被称为RNN),它被应用于语音识别等领域。最近几年,科学家还展示了通过让两个神经网络在竞赛中互相对抗[称为生成对抗网络(generative adversarial network,GAN)],来生成人眼无法辨别的写实图像。

在本节中,我们会研究神经网络的基础结构,所有复杂的神经网络都是基于此构建的。同时,我们也会使用Python开始构建最基础的神经网络(不使用任何机器学习函数库)。这一练习会帮助我们理解神经网络的内部工作原理。

神经网络包含如下组成部分:

一个输入层x

一定数量的隐藏层;

一个输出层ŷ

每一层之间包含权重W和偏差b

为每个隐藏层所选择的激活函数σ

图1-5所示的为一个两层神经网络的结构(注意,在统计神经网络层数的时候,输入层通常不被计算在内)。

图1-5

现在我们已经了解了神经网络的基本结构,让我们使用Python从头创建一个神经网络吧!

首先,在Python中创建一个神经网络的类:

import numpy as np

class NeuralNetwork:
    def__ init__(self, x, y):
       self.input    = x
       self.weights1 = np.random.rand(self.input.shape[1],4) 
       self.weights2 = np.random.rand(4,1)
       self.y        = y
       self.output = np.zeros(self.y.shape)

注意前述代码,权重(self.weights1self.weights2)被初始化为一个包含随机数的NumPy数组。NumPy数组被用来表示Python中的多维数组。上述代码中权重的维度是通过np.random.rand函数的参数来设定的。基于输入的维度,使用变量(self.input.shape[1])创建了对应维度的数组。

一个简单的两层神经网络的输出:ŷ,表述为如下形式:

你也许注意到了,在上述公式中,权重W以及偏差b是影响输出ŷ的唯一变量。

因此,正确的权重和偏差决定了预测的强度。对权重和偏差进行调优的过程被称为神经网络的训练。

迭代训练神经网络的每一个循环都包括以下步骤:

1.计算预测输出ŷ,被称为前馈(feedforward);

2.更新权重和偏差,被称为反向传播(backpropagation)。

图1-6对该步骤做出了解释。

图1-6

1.前馈

在图1-6中我们可以看到,前馈就是简单的计算。而对于一个基础的两层神经网络来说,网络的输出可以用下列公式表示:

    

下面,在Python代码中增加一个feedforward函数来完成上述功能。注意,为了降低难度,我们假设偏差为0

import numpy as np

def sigmoid(x):
    return 1.0/(1 + np.exp(-x))

class NeuralNetwork:
    def__init__(self, x, y): 
       self.input    = x
       self.weights1 = np.random.rand(self.input.shape[1],4) 
       self.weights2 = np.random.rand(4,1)
       self.y        = y
       self.output   = np.zeros(self.y.shape)

    def feedforward(self):
       self.layer1 = sigmoid(np.dot(self.input, self.weights1))
       self.output = sigmoid(np.dot(self.layer1, self.weights2))

然而,我们还需要找到一种方法来评估预测的准确率(预测偏差有多大)。损失函数(loss function)可以帮助我们完成这个工作。

2.损失函数

损失函数有很多种,它的选择需要根据待解决问题的本质来决定。就目前来讲,我们选择一个平方和误差(Sum-of-Squares Error)作为损失函数:

    

平方和误差就是对实际值和预测值之间的差值求和,不过我们对其进行了平方运算,因此计算结果是其绝对差值。

我们的目标是训练神经网络并找到能使得损失函数最小化的最优权重和偏差。

3.反向传播

现在已经计算出了预测结果的误差(损失),我们需要找到一种方法将误差在网络中反向传导以便更新权重和偏差。

为了找到合适的权重及偏差矫正量,我们需要知道损失函数关于权重及偏差的导数。

回忆一下微积分知识,一个函数的导数就是该函数的斜率,如图1-7所示。

图1-7

如果得到了导数,我们就可以根据导数,通过增加导数值或减少导数值的方式来调节权重和偏差(如图1-7所示)。这种方法称为梯度下降法(gradient descent)。

然而,我们不能直接求损失函数关于权重和偏差的导数,因为损失函数中并不包含它们。我们需要利用链式法则(chain rule)进行计算。就目前阶段来讲,我们不会深究链式法则,因为其背后的数学原理相当复杂。而且,像Keras等机器学习库会帮我们完成梯度下降计算而不需要从头编写链式法则。

我们需要理解的关键点是,一旦我们得到了损失函数关于权重的导数(斜率),我们便可以依此相应地调整权重。

现在,向代码添加backprop函数 :

import numpy as np

def sigmoid(x):
    return 1.0/(1 + np.exp(-x))

def sigmoid_derivative(x): 
    return x * (1.0 - x)

class NeuralNetwork:
    def __init__(self, x, y):
        self.input    = x
        self.weights1 = np.random.rand(self.input.shape[1],4)
        self.weights2 = np.random.rand(4,1)
        self.y        = y
        self.output = np.zeros(self.y.shape)

    def feedforward(self):
        self.layer1 = sigmoid(np.dot(self.input, self.weights1))
        self.output = sigmoid(np.dot(self.layer1, self.weights2))

    def backprop(self):
        # 使用链式法则来找到损失函数关于weights2和weights1的导数
        d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) *
         sigmoid_derivative(self.output)))
         d_weights1 = np.dot(self.input.T, (np.dot(2*(self.y - self.output)
         * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_
         derivative(self.layer1)))

         self.weights1 += d_weights1 
         self.weights2 += d_weights2

if __name__ == "__main__": 
    X = np.array([[0,0,1],
                  [0,1,1],
                  [1,0,1],
                  [1,1,1]])
    y = np.array([[0],[1],[1],[0]])
    nn = NeuralNetwork(X,y)

    for i in range(1500):
        nn.feedforward()
        nn.backprop()

    print(nn.output)

注意上述代码,我们在feedforward函数中使用了一个sigmoid函数。sigmoid函数是一种激活函数,它将函数值压缩到0~1。这一特性很重要,因为对于二元预测问题,我们需要预测结果位于0~1。我们将在第2章中详细探讨sigmoid激活函数。

现在我们已经完成了具有前馈和反向传播功能的Python代码,让我们在以下案例中应用该神经网络,看看它效果如何。

表1-1包括了4个数据点,每个点包括3个输入变量(x1, x2x3)和一个目标变量(Y)。

表1-1

x1

x2

x3

Y

0

0

1

0

0

1

1

1

1

0

1

1

1

1

1

0

我们的神经网络需要学习到能够表示该函数的最理想权重。注意,如果我们想要通过观察的方式来确定这一组权重,可不是什么容易的事。

迭代训练神经网络1500次,看看发生了什么。如图1-8所示,从损失-迭代次数图可以清晰地看出,损失是单调递减到最小值的。这和我们之前讨论的梯度下降算法的描述是一致的。

让我们看一下神经网络经过1500次迭代训练后最终的预测(输出)结果,如表1-2所示。

表1-2

预测值

Y (实际值)

0.023

0

0.979

1

0.975

1

0.025

0

图1-8

成功了!我们的前馈和反向传播算法成功地训练了神经网络且预测值向真实值收敛。

注意预测值和真实值之间存在的微小差异。这是我们期望发生的,它可以防止模型的过拟合(overfitting)并使其能够更好地泛化以便处理新的数据。

现在已经知道了神经网络的内部原理,接下来会介绍Python的机器学习函数库,这些函数库在后续的章节中都会用到。如果你感到从头创建一个神经网络非常困难,请不必担心。在本书的后续部分,我们会使用机器学习库来极大地简化神经网络的构建和训练过程。

深度学习是什么?它和神经网络有什么区别?简单来讲,深度学习是一种机器学习算法,它使用多层神经网络进行学习(也被称为深网)。如果我们将一个单层感知器看作最简单的神经网络,那么深度神经网络则走向了复杂性的一个极端。

在深度神经网络(DNN)中,每一层学习到的信息的复杂度是不断增加的。例如,当训练一个用于进行面部识别的深度神经网络时,第一层用于检测脸部的轮廓,然后是识别轮廓(例如眼睛)的层,直到最后完成全部的脸部特征识别。

尽管感知器在20世纪50年代就产生了,但是深度学习一直到近几年才开始蓬勃发展。深度学习在过去一个世纪发展相对比较缓慢,很大程度上是由于缺少数据以及相应的计算能力。然而,在过去的几年中,深度学习成为了驱动机器学习的关键技术。今天,深度学习已经成为图像识别、自动驾驶、语音识别和游戏领域的首选算法。那么,过去几年究竟发生了什么呢?

近些年来,用于存储深度学习所需的海量数据的计算机存储设备变得经济实惠。如果你将数据存放在云端,存储数据的费用还可以变得更便宜,而且可以被世界各地的计算机集群访问。除了拥有能够消费得起的数据存储服务之外,数据也变得更加平民化。例如像ImageNet这样的网站,它们向机器学习研究人员提供了1400万张图像。数据已经不再是少数人才能拥有的商品了。

深度学习所需的计算能力同样变得更便宜也更强大。大多数的深度学习项目受益于图形处理单元(GPU),它非常擅长满足深度神经网络的计算需求。继续刚才关于平民化的话题,现在很多网站给深度学习爱好者提供免费的GPU处理资源。举例来说,Google Colab提供免费的Tesla K80 GPU云服务用于深度学习,每个人都可以使用。

基于这些近期的技术发展,深度学习已经成为了人人都能使用的技术。在后面的章节中,我们会介绍一些你将会用到的Python深度学习函数库。

在数据分析领域,pandas可能是应用最为广泛的库。pandas基于强大的NumPy库构建,它提供了快速且灵活的数据结构,可以用来处理现实世界中的数据集。原始数据通常用表格形式呈现并通过.csv 格式文件进行分享。pandas为导入.csv文件提供了便捷的接口并用一种名为DataFrame的数据结构进行存储,这使得在Python中操作数据变得非常轻松。

pandas DataFrame是一个二维数据结构,你可以把它看作Excel的单元格。DataFrame使你能够通过简单的指令导入.csv文件:

import pandas as pd
df = pd.read_csv("raw_data.csv")

数据导入为DataFrame类型之后,我们便可以轻易地对其进行数据分析。我们将通过鸢尾属植物数据集(Iris flower Data Set)来讲解。鸢尾属植物数据集是一个很常用的数据集,它包含了几类鸢尾属植物的测量数据(萼片的长度和宽度,花瓣的长度和宽度)。首先,让我们导入加州大学欧文分校(UCI)免费提供的数据集。注意,pandas可以直接从URL导入数据集:

URL = \
'*****://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
df = pd.read_csv(URL, names = ['sepal_length', 'sepal_width',
                               'petal_length', 'petal_width', 'class'])

现在数据已经存入DataFrame,我们可以很方便地操作数据了。然后来获取数据集的汇总信息,因为了解即将要操作的数据集是很重要的。

print(df.info())

代码的执行结果如图1-9所示。

图1-9

数据集有150行,每一行有5列,其中有4列是数值形式的信息,包括sepal_ length、sepal_width、petal_lengthpetal_width。另外还有一列包含了非数值形式的信息,表示花的种类。

我们可以通过调用describe函数快速获取4个数值列的统计信息:

print(df.describe())

输出结果如图1-10所示。

图1-10

下一步让我们看看表中前10行的数据:

print(df.head(10))

输出结果如图1-11所示。

图1-11

很简单,对吧?pandas同样可以帮助我们轻松地进行数据清洗。例如,下面的操作可以过滤并筛选sepal_length大于5.0的行:

df2 = df.loc[df['sepal_length'] > 5.0, ]

输出结果如图1-12所示。

图1-12

通过loc命令我们可以获取一组行和列中的数据。

探索性数据分析(EDA)也许可以称得上是机器学习工作流里最重要的一个步骤了,pandas使我们可以非常轻松地利用Python进行数据可视化。pandas提供了基于matplotlib的高级应用程序接口(API),这使得利用DataFrame数据绘制图表变得非常容易。

举个例子,可以通过对鸢尾属植物数据集进行可视化来揭示一些重要的信息。首先绘制散点图观察sepal_widthsepal_length的关系。我们可以通过DataFrame. plot.scatter()方法轻松创建散点图,这个方法是所有DataFrame的内建方法。

# 为不同的类别定义不同的散点图图标
import matplotlib.pyplot as plt
marker_shapes = ['.', '^', '*']

# 然后绘制散点图 
ax = plt.axes()
for i, species in enumerate(df['class'].unique()):
    species_data = df[df['class'] == species]
    species_data.plot.scatter(x='sepal_length', y='sepal_width',marker=
                                marker_shapes[i],s=100,title="Sepal Width  
                                    vs Length by Species",label=species,
                                    figsize=(10,7), ax=ax)

输出的散点图如图1-13所示。

图1-13

从散点图中我们可以洞察出一些有趣的信息。首先,sepal_widthsepal_length的关系和种类相关。Setosa(点)的sepal_widthsepal_length差不多是线性关系。相对于Setosa而言,versicolor(三角)和virginica(星号)的sepal_length要大得多。如果我们要设计一个机器学习算法来预测花的种类,那么sepal_widthsepal_length是模型需要包含的一组重要特征。

然后,画出直方图看看分布情况。和散点图一样,pandas DataFrame提供了内建的方法用于绘制直方图,使用DataFrame.plot.hist函数:

df['petal_length'].plot.hist(title='Histogram of Petal Length')

输出结果如图1-14所示。

图1-14

可以看到花瓣长度是一种双峰分布。相对于其他类型的花,某种类型的花的花瓣长度更短。同样也可以画出数据的箱线图(boxplot)。箱线图是一种重要的数据可视化工具,数据科学家使用箱线图,并基于第一四分位数、中位数、第三四分位数来理解数据的分布情况:

df.plot.box(title='Boxplot of Sepal Length & Width, and Petal Length &
Width')

输出结果如图1-15所示。

图1-15

从箱线图我们可以看出sepal_width的方差远小于其他变量,而petal_length则有着最大的方差。

使用pandas直接进行数据可视化是如此得简单方便。请记住,探索性数据分析在机器学习工作流中是至关重要的一步,在本书的其他项目中,我们都会对其进行探索性数据分析。

最后,让我们看看如何使用pandas进行数据预处理,尤其是如何对类别变量进行编码以及填补缺失值。

1.编码类别变量

在机器学习项目中,数据集含有类别变量是很常见的情况。以下是一些类别变量的例子。

性别:男性、女性。

日期:星期一、星期二、星期三、星期四、星期五、星期六、星期日。

国家:美国、英国、中国、日本。

机器学习算法(例如神经网络)是无法处理类别变量的,因为它只接收数值变量。为此我们需要在将类别变量输入机器学习算法前对其进行预处理。

将类别变量转化为数值变量的一个常用方法是独热编码(One-hot encoding),可在pandas中通过get_dummies函数实现。独热编码将n个类别变量转换为n个二元特征。案例如图1-16所示。

图1-16

从本质上看,转换后的特征是二元特征,如果表示原本的特征则置为1,否则置为0。可以想象,如果为此手动编写代码会很麻烦。幸运的是,pandas提供一个便捷的函数帮你处理这件事。首先,让我们使用图1-16中的数据在pandas中创建一个DataFrame:

df2 = pd.DataFrame({'Day': ['Monday','Tuesday','Wednesday',
                            'Thursday','Friday','Saturday',
                            'Sunday']})

输出如图1-17所示。

图1-17

在pandas中对原始数据的分类特征进行独热编码,只需要调用下面的函数:

print(pd.get_dummies(df2))

输入如图1-18所示。

图1-18

2.填充缺失数据

正如前面所探讨的,填充缺失数据是机器学习工作流中的必要步骤。真实世界的数据集非常杂乱而且通常包含缺失的数据。大多数的机器学习模型,例如神经网络遇到缺失数据是不能工作的,因此我们必须在将数据传入模型之前对其进行预处理。pandas使得处理缺失数据变得非常容易。

我们会使用前面提到的鸢尾属植物数据集来讲解如何填充缺失数据。鸢尾属植物数据集中原本并没有缺失数据,为了这个练习,我们故意删掉其中一些数据。下面的代码会在数据集中随机选择10行数据并删除其中的sepal_length值:

import numpy as np
import pandas as pd

# 导入iris数据集
URL = \
'*****://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
df = pd.read_csv(URL, names = ['sepal_length', 'sepal_width',
                               'petal_length', 'petal_width', 'class'])

# 随机选择10行
random_index = np.random.choice(df.index, replace= False, size=10)

# 将这些列中的sepal_length设置为None
df.loc[random_index,'sepal_length'] = None

让我们使用修改后的数据集,看看应该如何处理缺失的数据。首先,查看有哪些缺失的数据:

print(df.isnull().any())

print函数的输出结果如图1-19所示。

果不其然,pandas告诉我们sepal_length中有缺失的数据。这个命令对找到数据集中的缺失数据很有用。

处理缺失数据的一个办法是把它们所在的行直接移除。pandas提供了一个非常方便的函数dropna来完成这个操作:

print("Number of rows before deleting: %d" % (df.shape[0]))
df2 = df.dropna()
print("Number of rows after deleting: %d" % (df2.shape[0]))

输出结果如图1-20所示。

图1-19

图1-20

另外一个方法是将缺失的sepal_length用其他sepal_length的均值代替:

df.sepal_length = df.sepal_length.fillna(df.sepal_length.mean())

在pandas中使用df.means()计算平均值时,pandas会自动排除缺失的值。

现在,让我们确认数据集中不再包含缺失值(如图1-21所示)。

图1-21

缺失值的问题解决后,我们可以将DataFrame传递到机器学习模型中了。

我们已经了解了如何使用pandas导入.csv格式的表格数据,并使用pandas内置函数进行预处理和数据可视化。在本书的余下内容中,如果数据是表格形式的,我们还会使用pandas。pandas在数据预处理和探索性数据分析中将起到至关重要的作用,在后续的章节我们会见证这一点。

TensorFlow是一个用于神经网络和深度学习的库。它由谷歌大脑团队开发,该团队专门针对可扩展性对其进行了设计。TensorFlow可以在多种平台上运行,无论是桌面设备还是移动设备,甚至是计算机集群。如今,TensorFlow已经成为最流行的机器学习库之一,且在实际应用软件中有着非常广泛的应用。例如,很多如今使用的在线服务,其背后的AI系统是由TensorFlow驱动的,其中包括图像搜索、语言识别、推荐引擎。TensorFlow已经变成了很多AI应用的幕后英雄,即使我们并没有注意到。

Keras是构建在TensorFlow上的高级应用程序接口(API)。为什么要用Keras呢?为什么我们需要另外一个函数库来作为TensorFlow的接口?简单来讲,Keras消除了构建神经网络的复杂性,可以快速构建模型进行实验和测试,而不需要让用户考虑底层的实现细节。Keras基于TensorFlow提供了简单且符合直觉的API以用于构建神经网络。它的设计准则是模块化和可扩展性。我们后面会看到,通过组合调用Keras API可以非常轻松地构建神经网络,你可以把它看作通过堆积乐高模块来构建大型结构。这一对新手友好的特性使Keras成为了最流行的Python机器学习库之一。本书将使用Keras作为构建神经网络项目的首要机器学习库。

Keras中的基础构建单元是层(layer)。通过将多个层线性地堆叠起来,可以构建出神经网络模型。我们使用优化器(optimizer)对模型进行训练并选择损失函数作为评估标准。回忆一下,之前我们从头构建神经网络时,需要编写代码来实现这些模块。我们把这些模块称为Keras中的基本结构单元,因为可以基于这些基本结构单元构建任意的神经网络。

Keras基本构建单元之间的关系如图1-22所示。

图1-22

1.层——Keras中构建神经网络的基本元素

你可以把Keras中的层看作原子,因为它们是神经网络中最基本的单元。每层可以接收输入并进行数学运算,然后将输出结果传递给下一层。Keras中的核心层包括致密层(dense layer),激活层(activation layer)和Dropout层。还有另外的一些更复杂的层,包括卷积层(convolutional layer)和池化层(pooling layer)。在本书中,这些不同种类的层都会在项目中出现。

就目前来讲,让我们仔细研究一下Dense层,这是我们目前在Keras中最常用到的层。Dense层也就是我们所说的全连接层(fully-connected layer)。Dense层是全连接的,因为它在其实现的数学函数中使用了全部的输入(与之相对的是仅使用部分输入)。

一个Dense层实现了如下的函数:

    

是输出,是激活函数,x是输入,而Wb分别是权重和偏差。

这个公式对你来说应该很眼熟吧。我们在手动编写神经网络时用过全连接层。

2.模型——层的集合

如果层可以被看作原子,那么模型就可以被看作Keras中的分子。一个模型就是一些层的集合,在Keras中最常用的模型是顺序模型(sequential model)。顺序模型允许我们将层线性地堆叠起来。这使得我们可以轻松地构建模型结构而不需要操心其背后的数学原理。在后面的章节我们会看到,要想让连续的层之间具有互相兼容的维度需要耗费很大精力,而这些工作Keras已经默默地替我们完成了。

一旦定义好了模型,就需要开始定义训练流程了,在Keras中可以通过compile方法完成。compile有很多参数,其中需要定义的最重要的参数是损失函数和优化器。

3.损失函数——神经网络训练误差评估标准

在前面的章节中,我们定义损失函数作为评价预测好坏的标准。问题的特点应该作为选择损失函数的依据。Keras中有很多损失函数,常用的有mean_squared_error
categorical_crossentropybinary_crossentropy

对于如何选择损失函数,这里有一些经验法则:

如果是回归问题选择均方差函数(mean_squared_error);

如果是多类别分类问题选择分类交叉熵(categorical_crossentropy);

如果是二元分类问题选择二元交叉熵(binary_crossentropy)。

在某些情况下,你可能会发现Keras默认的损失函数并不适用于你的问题。在这种情况下你可以通过使用Python中定义函数的方法定义你自己的损失函数,然后把这个自定义函数传递给Keras的compile方法。

4.优化器——神经网络训练算法

优化器是一种用于在神经网络训练过程中更新权重的算法。Keras中的优化器基于梯度下降算法,该算法在前面的章节我们已经有所涉及。

尽管并没有涉及不同种类优化器的细节,但是需要注意的是,我们对优化器的选择需要基于待解决问题的特点。通常来讲,研究人员发现Adam优化器对深度神经网络来讲是最佳的,而SGD优化器则更适合浅层神经网络(shallow neural network)。Adagrad优化器同样也是一个很流行的选择,它根据权重被更新的频率自适应地选择学习速率,这种方法的主要优点是可以避免手动调节学习速率这一超参数,而调参在机器学习工作流中是非常耗时的一步。

让我们看看如何使用Keras创建一个之前介绍过的两层神经网络吧。为了构建一组线性层,首先在Keras中声明一个顺序模型:

from keras.models import Sequential
model = Sequential()

上述代码会创建一个空的顺序模型以便我们可以向其中添加层。在Keras中向模型添加层非常简单,和一层一层搭乐高积木一样。我们先从左面开始添加层(最靠近输入的一层):

from keras.layers import Dense 
# Layer 1
model.add(Dense(units=4, activation='sigmoid', input_dim=3)) 
# 输出层
model.add(Dense(units=1, activation='sigmoid'))

在Keras中添加层非常简单,只需要调用model.add()命令即可。注意我们必须为每一层定义节点个数,节点个数越多模型也就越复杂,因为这意味着要训练的权重也越多。对于第一层,我们需要定义input_dim,它将数据集中特征的数量(列数)告知Keras。同时要注意我们使用了Dense层。Dense层就是全连接层(fully connected layer),在后续的章节里面我们会向你介绍各种类型的层,它们适用于不同类型的问题。

可以调用model.summary函数来验证模型结构:

print(model.summary())

输出结果如图1-23所示。

图1-23

params的数量指的是在我们刚刚定义的模型中,需要训练的权重和偏差的个数。

当对模型结构感到满意之后,让我们编译模型并开始训练吧:

from keras import optimizers 
sgd = optimizers.SGD(lr=1)
model.compile(loss='mean_squared_error', optimizer=sgd)

注意我们定义了SGD优化器的学习速率为1.0(lr=1)。学习速率是神经网络的一种超参数,需要根据问题小心地调优。我们会在后面的章节中仔细讲解超参数的调优。

Keras中的均方差(mean_squared_error)损失函数和先前定义的平方和损失函数类似。我们使用SGD优化器来训练模型。回忆一下,我们用梯度下降法更新权重和偏差,将其向损失函数关于权重和偏差的导数减小的方向去调节。

让我们使用之前用于训练神经网络的数据来训练这个神经网络。这样就可以将Keras构建的神经网络预测结果与之前我们徒手打造的神经网络预测结果进行比较。

定义一个x数组和y数组,分别对应特征和目标变量:

import numpy as np
np.random.seed(9)

X = np.array([[0,0,1],
              [0,1,1],
              [1,0,1],
              [1,1,1]])
y = np.array([[0],[1],[1],[0]])

对训练模型进行1500轮训练:

model.fit(X, y, epochs=1500, verbose=False)

使用model.predict()命令来获取预测结果:

print(model.predict(X))

预测结果如图1-24所示。

图1-24

与之前获得的预测结果进行对比,可以看到两个预测非常接近。使用Keras最大的优势在于构建神经网络时不需要像之前一样,操心底层的实现和数学原理。实际上,我们不需要做任何数学计算。只需要调用一系列的API就可以构建出神经网络,这样我们就可以专注于更高层次的细节,并进行快速实验。

除了 pandas和Keras,我们还会使用其他的Python库,例如scikit-learn和seaborn。scikit-learn是一个开源的机器学习库,被很多机器学习项目所使用。我们使用它主要是为了在数据预处理阶段将数据集分为训练数据集和测试数据集。seaborn是另外一个数据可视化库,最近受到了越来越多的关注。在后续的章节中我们会学习如何使用seaborn来进行数据可视化。

本章我们学习了什么是机器学习,看到了机器学习项目完整的端到端工作流。我们同时还学习了什么是神经网络和深度学习,既从头编写了神经网络,也基于Keras实现了神经网络。

在后面的章节中,我们会创建自己的真实神经网络项目。每个章节会包括一个项目,项目的难度由浅入深。当你读完本书的时候,你已经完成了医学诊断、出租车费用预测、图像分类、情感分析等等神经网络项目。在第 2 章中,我们会通过多层感知器(Multilayer Perceptron,MLP)对糖尿病进行预测。让我们开始吧!

微信扫码关注【异步社区】微信公众号,回复“e54920”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。


相关图书

Python极客项目编程(第2版)
Python极客项目编程(第2版)
动手学自然语言处理
动手学自然语言处理
Python财务应用编程
Python财务应用编程
Web应用安全
Web应用安全
深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
Python量子计算实践:基于Qiskit和IBM Quantum Experience平台
Python量子计算实践:基于Qiskit和IBM Quantum Experience平台

相关文章

相关课程