奎克的藏经阁 · MinerU 解析内容

人工智能与大数据技术导论

490 个 PDF 物理页 · 本页显示文件第 221–230 页

PDF 物理页索引 220

文件中的第 221 页 · 印刷页码:204

将当前选定的矩阵与卷积核矩阵对应元素相乘,得到1,将其填入第2个格中,图7-17所示。

以此类推,第二行第一个方格通过原矩阵第2到4行、第1到3列围成的区域与卷积核相乘得到。第三行第三个方格由原矩阵右下角的方阵与卷积核相乘所得。最终即可得到结果。

7.4.2 卷积层

通过上面的介绍,我们知道了一个方阵可以和一个卷积核(同样为一个方阵)进行卷积运算,得到一个新的方阵。假设输入矩阵为 $\mathrm { h } ^ { \ast } \mathrm { w }$ (h为长度,w为宽度,通常h与w相等),卷积核为f\*f,那么得到的输出矩阵的长度和宽度为h-f+1和w-f+1。通常f的值不大,一定小于h和w,3\*3、5\*5、7\*7的卷积核比较常见。

这只是卷积运算最“标准”的情况。要了解卷积神经网络中卷积运算的实际操作,我们还需要了解Padding和Strike的概念。事实上,我们可以通过Padding和Strike得到尺寸和上述计算不一样的矩阵。Padding和Strike也是卷积运算中极为重要的概念,可以通过调节它们改变我们想要的输出矩阵的格式。

Padding

Padding指的是对输入矩阵的尺寸进行“扩展”,在矩阵外围增加一个“套环”(通常由0来填充)。比如,一个3\*3的矩阵通过Padding得到了一个5\*5的矩阵。Padding的参数p是在进行一次卷积运算中可以控制的参数。通过设置参数p,我们可以控制输出层想要得到的矩阵的尺寸。

●从二维到三维

我们知道,卷积神经网络在计算机视觉领域被广泛应用。在图像处理中,我们的输入数据不止停留在二维。二维像素点矩阵只能描述黑白图片,绝大多数图片为彩色,是由3个频道(通常为R、G、B三原色)的像素点方阵组成的,所以具有3个维度。

人工智能与大数据技术导论

204

PDF 物理页索引 221

文件中的第 222 页 · 印刷页码:205

假设我们有一个32\*32\*3格式的图片,将这个图片与一个5\*5的卷积核进行卷积,将可以得到一个28\*28的矩阵。这里输入数据中的第三个维度,也就是频道数,在卷积过程中求和,所以输出数据的第三个维度为1,而不是3。

卷积层是卷积神经网络的重要组成部分。卷积层顾名思义是对(上一层的)输入数据进行卷积运算,将得到的结果传递给下一层。那么卷积层有什么作用呢?卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征,如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。卷积神经网络由多个上述这样结构的卷积层组成。除了卷积层之外,还包括池化(Pooling)层和全连接(FullConnection)层。

池化层实际上是一种形式的向下采样。有多种不同形式的非线性池化函数,而其中最大池化(MaxPooling)和平均采样是最为常见的。Pooling层相当于把一张分辨率较高的图片转化为分辨率较低的图片。Pooling层可进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络中参数的目的。全连接层使用与普通神经网络一样的连接方式,一般都在最后几层。

7.4.3 CNN 实例

我们的任务是从几万张带标签的手写数字图片中训练一个分类器,来正确识别图片所写的数字。数据集由阿拉伯数字0\~9组成。该数据集来自经典的手写体图片数据库MINST,用于设计算法和模型,被称为计算机视觉领域的“HelloWorld”,如图7-18所示。

这个数据集中,每个样本代表一个数字图片,图片全部是黑白的。在这个案例中,我们会用到CNN作为分类器,具体会用到LeNet-5神经网络结构。LeNet-5是一种经典的卷积神经网络结构,由YannLeCun发明,专业用于识别手写体和印刷体文字,并且表现得十分出色。我们以这个任务为情景,以LeNet-5为分类器模型,来介绍TensorFlow是如何完成卷积神经网络的识别任务的(TensorFlow会在后面三章中详细讲解)。识别过程如图7-19所示。

第7章 深度学习

205

PDF 物理页索引 222

文件中的第 223 页 · 印刷页码:206

  1. 载入和预处理数据

首先打开Python,加载TensorFlow和其他需要的基本程序包。

读取数据。我们的数据源来自Kaggle竞赛数据集,包括train和test两个CSV文件:

和上一个案例一样,我们先来了解原始数据集的大致情况。通过下面几个shells可以看出:

● 训练集和测试集分别包含42000和28000个样本。

● 训练数据包括785个变量,其中1个为标签数据(变量名为label)。

●测试数据集需要我们提交预测结果上传到比赛网站,只有784个变量,没有标签。

●特征有784个,每一个代表图片中的一个像素点。图片由28\*28个像素点排列而成。

人工智能与大数据技术导论

206

PDF 物理页索引 223

文件中的第 224 页 · 印刷页码:207

将标签数据分离作为y,其余作为特征集X(同时,这里将原先的dataframe数据格式转换为仅保留数据的矩阵形式,以方便计算处理):

我们来观察特征X的情况。根据下面几个shells可以看出:

●像素点数值绝大多数为0,这是因为一张图片除了中间区域之外都是空白。

● 数值最小为0,最大为255。

y的前几个观测值数据如下,分别代表数字1、0、1、4、0。

现在我们将X展开成28×28的形式。此时,可以观察每个观测值的样子,通过图片的形式呈现。Matplotlib提供了将像素点数值转换成图片的接口:imshow函数。

第7章 深度学习

207

PDF 物理页索引 224

文件中的第 225 页 · 印刷页码:208

要使用卷积神经网络,我们还需要进一步将X的每一条记录展开成28×28×1的形式(图片为黑白色,所以只有1个channel)。这时X变成了四维(样本数为第一个维度,每一个样本是28×28×1的三维数据)。

然后对输入数据X进行标准化处理。这里输入数据的数字全部处于0\~255之间,因此我们将其除以255,使数字落在0\~1之间:

除了X之外,这里还需要对标签值Y进行处理,Y的范围为数字0\~9,属于多分类,需要对其进行独热编码(one-hot encoding)。这是将多类别数值转化为0或1数值的操作,方便处理。读者可以发现,经过这个处理后,长度为42000的向量ytrain变成了42000×10的矩阵(称为大写的Ytrain)。原先y的每个数值被对应为一个维度为10的向量。Y等于几,这个向量的第几个维度就等于1,其他均为0。

人工智能与大数据技术导论

208

PDF 物理页索引 225

文件中的第 226 页 · 印刷页码:209

  1. 构建 graph

现在可以开始构建graph了。这里我们先将构建graph需要的组件以函数的形式写出来,后面组合这些组件,只需调用这些函数即可。这样可以使代码的结构清晰,以方便后期调整参数,调试模型。

首先建立placeholder,用来存储输入数据X和Y,以及在优化中会用到的Dropout参数keep\_prob。这些占位符可以在执行session时再输入具体信息,在后期有调整的余地。

LeNet5模型的结构如下:

在构建网络前,先初始化参数(LeNet5中的参数存在于两个conv2d层和3个全连接层,这里只需初始化W1和W2,全连接层的参数会在运算时自动被建立和初始化;另外,偏置参数b也无须初始化):

第7章 深度学习

209

PDF 物理页索引 226

文件中的第 227 页 · 印刷页码:210

根据上述结构完成神经网络模型的代码:

计算损失函数:

.5 深度学习的优势

在对深度学习的神经网络结构和原理有大致认识后,我们来分析一下这个结构为深度学习带来了什么优势。

深度学习最大的一个优势在于,它整合了特征提取的过程,可以自动学习数据集的特征。我们在前文中提到,特征工程是机器学习极其重要的一个环节,需要我们在使用机器学习模型之前建立合适的特征集。但复杂、多层的神经网络具有自主学习原始特征并进行特征工程的能力,这让我们在一定条件下可以省去手动进行特征工程这一步骤,因为深度学习模型本身可以帮我们做到。

这个结果对我们来说是相当诱人的。特征工程在人工进行的情况下耗时耗力,需要用统计方法研究特征的分布和相关性等特点进行构建、筛选、整合和重组。追求一个好的特征集能让我们的模型表现显著提升,但完美的特征集是可遇不可求的,因为特征集选取的可能性非常多,甚至是无限的。为了得到一个“最优”的特征集,我们经常要经过特征选择→模型评估→重新选择特征的反复循环过程。

深度学习之所以能从原始数据中学习特征,其背后的原理大致可以这样解释:深度学习模仿了生物学神经元传递的过程,这一过程与人脑的工作原理十分相似。

人工智能与大数据技术导论

210

PDF 物理页索引 227

文件中的第 228 页 · 印刷页码:211

值得指出的是,深度学习并非万能,只是为人工智能选择合适的机器学习方法。深度学习也有缺点,绝不是万能的方法。比如,关于如何进行深层神经网络的内部设计,目前还没有人能够提出一个明确的设计指南。所以,人类应该发挥的第一个作用就是选择合适的机器学习方法。除了深度学习之外,机器学习的方法还有很多。对于很多企业来说,与其一下子就尝试难以驾驭的深度学习,不如引入现有的机器学习方法更具实际意义。

7.6 深度学习的实现框架

下面介绍深度学习的常见框架。

TensorFlow 平台

笔者最初接触AI时,最先听说的框架就是谷歌的TensorFlow。TensorFlow是一个使用数据流程图进行数值计算的开源软件。这个不错的框架因其架构而闻名,它允许在任何CPU或GPU上进行计算,无论是桌面、服务器,还是移动设备。它可在Python编程语言中使用。TensorFlow的优点是,使用简单易学的语言,如Python;使用计算图进行抽象;可以使用TensorBoard获得可视化。

• Caffe

Caffe是一个强大的深度学习框架。它对于深入学习的研究而言,是非常快速和有效的。使用Caffe可以轻易地构建一个用于图像分类的卷积神经网络。它在GPU上运行良好,运行速度非常快。如图7-20所示是Caffe的主类。

Caffe的优点是可以与Python和MATLAB绑定使用,高性能,无须编写代码,即可训练模型;缺点是对递归网络支持不好。

● Keras

Keras是一个用Python编写的开源神经网络库。不似TensorFlow、CNTK、Theano这种端到端(End-to-End)的机器学习框架,相反,它是一个接口,提供了高层次的抽象,使得神

第7章 深度学习

211

PDF 物理页索引 228

文件中的第 229 页 · 印刷页码:212

经网络的配置变得更加简单,而不必考虑所在的框架。谷歌的TensorFlow目前支持Keras作为后端,而微软的CNTK也将在短时间内获得支持。

Keras的优点是对用户友好,易于上手,高度拓展,可以在CPU或GPU上无缝运行,完美兼容Theano和TensorFlow;缺点是不能有效地作为一个独立的框架使用。

CNTK

微软的CNTK(计算网络工具包)是一个用来增强模块化和保持计算网络分离的库,提供学习算法和模型描述。在需要大量服务器进行计算的情况下,CNTK可以同时利用多台服务器。据说CNTK在功能上接近谷歌的TensorFlow,但速度比对方要快一些。

CNTK的优点是高度灵活,允许分布式训练,支持C++、C#、Java和Python;缺点是由一种新的语言—NDL(网络描述语言)实现,缺乏可视化。

人工智能与大数据技术导论

212

PDF 物理页索引 229

文件中的第 230 页 · 印刷页码:未识别

第8章

TensorFlow

谷歌的TensorFlow是一个可用于构建机器学习模型的平台,是一种基于图的通用计算框架。

8.1 TensorFlow 工具包

TensorFlow.org上提供了完整的API列表。如图8-1所示,TensorFlow架构分为几层,底层API提供内核和通用库,最上层是TensorFlow社区添加的,可以让我们轻松地使用预先定义好的高级框架。我们最频繁使用的是TensorFlowEstimatorAPI,此API极大地简化了神经网络模型的构建过程。