---
schema_version: "library-reader-v1"
source_type: "original_book"
title: "人工智能与大数据技术导论"
author: null
edition: null
publisher: null
year: null
isbn: "9787302517986"
library_document_id: "cd4f7678-cd9b-4971-bde0-e9ad46a6cc71"
source_sha256: "5011cdcf83cd5e047c93a1ce7465f970fc88be69c93b94be3d7fa5fbddbb43f0"
pdf_physical_page_count: 490
pdf_physical_page_index_base: 0
range_start: 220
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71?start=220&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=220&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=210&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=230&limit=10"
---

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

> 页码规则：PDF_PHYSICAL_PAGE_INDEX 是从 0 开始的权威文件物理页索引；PRINTED_PAGE 是页面中识别出的印刷页码，可能为空，二者不得混用。

## PDF_PHYSICAL_PAGE_INDEX=220 | PRINTED_PAGE=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_PHYSICAL_PAGE_INDEX=221 | PRINTED_PAGE=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_PHYSICAL_PAGE_INDEX=222 | PRINTED_PAGE=206

1. 载入和预处理数据

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

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

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

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

● 训练数据包括785个变量，其中1个为标签数据（变量名为label）。

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

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

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

206

## PDF_PHYSICAL_PAGE_INDEX=223 | PRINTED_PAGE=207

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

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

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

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

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

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

第7章 深度学习

207

## PDF_PHYSICAL_PAGE_INDEX=224 | PRINTED_PAGE=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_PHYSICAL_PAGE_INDEX=225 | PRINTED_PAGE=209

2. 构建 graph

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

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

LeNet5模型的结构如下：

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

第7章 深度学习

209

## PDF_PHYSICAL_PAGE_INDEX=226 | PRINTED_PAGE=210

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

计算损失函数：

.5 深度学习的优势

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

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

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

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

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

210

## PDF_PHYSICAL_PAGE_INDEX=227 | PRINTED_PAGE=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_PHYSICAL_PAGE_INDEX=228 | PRINTED_PAGE=212

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

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

CNTK

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

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

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

212

## PDF_PHYSICAL_PAGE_INDEX=229 | PRINTED_PAGE=NOT_DETECTED

第8章

TensorFlow

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

8.1 TensorFlow 工具包

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

下一段：[继续读取](https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=230&limit=10)
