来源 |《Python人工智能开发从入门到精通》

作者 | 杨柳、郭坦、鲁银芝

责编 | 晋兆雨

深度学习在技术与应用上的突破引发了第三次人工智能浪潮,获得了空前成功。在前述章节的基础上,本章将主要介绍训练卷积神经网络和深度神经网络的重要方法与技巧,深度神经网络的迁移学习策略,以及如何训练深度神经网络以解决实际问题等内容。作为人工智能的核心研究内容,以卷积神经网络(ConvolutionalNeural Networks, CNNs)为代表的深度学习技术已在计算机视觉应用,如智能监控、智慧医疗及机器人自动驾驶等领域取得突破性进展,而这些应用的成功落地很大程度上依赖于视觉识别模块。

结合前文内容,本章将详细介绍如何构建并利用CNNs 这一功能强大的深度学习模型解决实际的图像识别问题。

*文末有赠书福利

受20世纪中期兴起的神经科学及脑科学研究的启发,通过模拟生物神经元接收和处理信息的基本特性,研究人员提出并设计了人工神经元。作为计算机科学、生物学和数学的交叉融合,卷积神经网络已经发展成为计算机视觉领域中最具影响力和有效的基础技术。

早在20 世纪60 年代,生物学家Hubel 和Wiesel 通过研究猫的视觉皮层,发现每个视觉神经元都只对一个小区域范围内的视觉图像产生响应,即感受野(Receptive Field)。初级视觉皮层中的神经元能够响应视觉环境中特定的简单特征,除此之外,Hubel 和Wiesel 通过研究发现了简单和复杂两种不同类型的细胞,其中简单细胞只在特定的空间位置对它们偏好的方向产生最强烈响应,而复杂细胞具有更大的空间不变性。

根据这些实验和分析,他们得出结论:复杂细胞通过在来自多个简单细胞(每个都有一个不同的偏好位置)的输入进行池化而实现这种不变性,这两个特性,即对特定特征的选择性和通过前馈连接增大空间不变性,构成了CNN人工视觉系统的生物及神经学基础。

发展至80年代,日本科学家Kunihiko Fukushima 通过研究并融合有关生物视觉的相关领域知识,提出了Neocognitron 神经认知机的概念,该神经认知机由S 细胞和C 细胞构成,可通过无监督的方式学习识别简单的图像。20 世纪90 年代,Yann LeCun 等人发表论文,确立了CNN 影响至今的经典网络结构,后来经过对网络结构的不断完善与改进,得到一种多层的人工神经网络,命名为LeNet-5,在手写数字识别任务上取得良好效果。和其他神经网络一样,LeNet-5能够使用反向传播算法(Back Propagation)训练。

LeNet-5 网络虽然较小,但它含有诸多神经网络学习的关键模块,具体包括卷积层、池化层及全连接层,这些基本模块构成当前深度神经网络模型的基础,下文将对LeNet-5 的结构及工作原理进行深入分析。同时,借助实例加深读者对卷积神经网络各个模块功能的理解。

卷积神经网络与LeNet-5

LeNet-5 出自Yann LeCun 教授于1998 发表的论文Gradient-Based Learning Applied to DocumentRecognition 中,LeNet-5 模型共有7 层,如图11-1 所示为LeNet-5 的基本网络架构。

LeNet-5 的基本网络架构

该模型除了输入层之外,每层都包含可训练参数,每个网络层产生多个特征图,每个特征图可通过一种卷积滤波器提取输入数据一种类型的特征。各个网络层的功能与参数情况介绍如下。

1. 输入层

首先是输入数据网络层,上例中输入图像尺寸统一归一化为32×32×1,其中1 表示输入图像为单通道的灰度图,一般不将该层作为LeNet-5 网络的基本构成,即不将输入层视为网络层次结构之一。

2. C1 层

C 取自Convolutional 的首字母,指卷积。读者可能对卷积的概念并不陌生,对数字图像做卷积运算,本质上是通过卷积核(卷积模板)在图像上滑动,将图像上的像素灰度值与对应卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应像素的灰度值,以此方式遍历完成对整张图像像素的卷积计算。如图11-2显示了图像卷积计算过程中一次相乘后相加的运算过程,该卷积核大小为3×3,卷积核内共有9 个数值,数值个数即为图像像素值与卷积核上数值相乘次数,运算结果-4 代替了原图像中对应位置处的值。按此方式,沿着图片以步长为1 滑动,每次滑动1个像素都进行一次相乘再相加的操作,即可得到最终的输出结果。

卷积计算过程

图像卷积计算中,卷积核的设计十分重要,一般需遵循如下基本规则。

  • 卷积核大小一般是奇数,奇数大小的卷积核使得卷积核关于中间像素点中心对称,因此卷积核尺寸一般是3×3、5×5或7×7。卷积核有中心,相应地就有半径的概念,如7×7 大小的卷积核,其半径为3。

  • 卷积核所有的元素之和一般应等于1,这是为了保持图像卷积计算过程中像素能量(亮度)的守恒。若滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮;反之,若小于1,那么得到的图像将会变暗。

  • 滤波后可能会出现负数或大于255 的数值。对这种情况,通常将它们直接截断到0~255之间即可。而对于负数,也可以取绝对值。

经卷积计算所得输出通常被称为“响应”,如果是边缘检测算子,那么响应为图像边缘,能够检测到特定的图像边缘。在LeNet-5网络中得到的响应是特征图(Feature Map),计算结果为输入图像的特征表达,卷积核的参数权重可以通过优化算法在监督信息的指导下自适应地学习得到。LeNet-5 网络中C1 层输入图像尺寸为32×32×1,卷积核大小为5×5,一共包括6 种大小为5×5 的卷积核,卷积核滑动一行之后,得到的结果的边长变为32-5+1,提取的特征映射大小是28×28,即(32-5+1)=28。6种不同的卷积核,可以从不同的角度提取图像不同特性的特征。

神经元数量为28×28×6,则可训练参数为(5×5+1)×6,即每个滤波器含5×5=25个单元权值参数和1个偏置参数,一共6 个滤波器,因此总的连接数为(5×5+1)×6×28×28=122 304。针对122 304 个连接,通过权值共享策略,只需学习156 个参数。

3. S2 层

S 指的是Subsamples,该网络层完成下采样操作,得到对应的特征图。下采样的原则是在减少数据量的同时尽可能保留有用的信息。与普通插值下采样的方式不同,该层实际采用的是一种被称为池化(Pooling)的方法。具体是将一幅图像分割成若干块,每个图像块的输出是该图像块原有像素的统计结果。

图像下采样池化方法有很多,如Mean-pooling( 均值采样)、Max-pooling( 最大值采样)、Overlapping ( 重叠采样)、L2-pooling( 均方采样)、Local Contrast Normalization( 局部对比归一化)、Stochastic-pooling( 随机采样) 和Def-pooling( 形变约束采样) 等,其中最经典的是最大池化,也是最常用的,下面简要介绍最大池化的实现原理。

为直观起见,假设有如图11-3(a)中大小为4×4 的图像,图像中每个像素点的值是上面各个格子中的数值。现在对这张4×4 大小的图像进行池化操作,池化的大小为(2,2),步长为2。采用最大池化操作,首先对图像进行分块,每个图像块大小为2×2,然后按照图11-3(b)中方式统计每个图像块的最大值,作为下采样后图像的像素值,得到图11-3(c)中结果,该过程即为最大池化。

除此之外,还有其他池化方法,如均值池化,具体是对每个块求取平均值作为下采样的新像素值。上述例子未涉及重叠采样,即每个图像块之间没有相互重叠的部分,而步长为2 时,图像分块不重叠。

最大池化操作示意图

LeNet-5 网络中的S2 层的输入是上一层的输出,共有6 个特征映射,每个特征映射的尺寸为28×28,使用2×2 大小的核进行池化操作,得到S2,即6 个14×14 大小的特征映射(28/2=14)。换言之,S2 中的池化层是对C1 中的2×2 区域内的像素求和乘以一个权值系数再加上一个偏置,然后将这个结果再做一次映射。与卷积层连接数的计算方法一样,连接数=参数个数×特征映射大小,即(2×2+1)×6×14×14=5880。

4. C3 层

C3 层同样是卷积层,输入为S2 中所有6 个或若干个特征图的组合。具体地,该层卷积核大小为5×5,一共有6种卷积核,输出特征图大小为10×10,即(14-5+1)=10。需要注意的是,C3 中每个特征图是连接到S2 中的所有6 个或若干个特征图的,即该层的特征图是上一层提取到的特征图的不同组合。如图11-4 所示,LeCun 在原论文中给出的一种组合连接方式。

LeNet-5 网络C3 层特征映射组合方式

图11-4 中共有6 行16 列,横轴代表C3 特征映射索引,纵轴代表S2 特征图索引。每列的X表示C3 中的每个特征映射与S2 中的特征图的连接情况,可以看到C3 的前6 个特征图,对应上图第1 个红框的6 列,以S2 中3 个相邻的特征图子集为输入,紧接着6 个特征图(对应上图第2 个红框的6 列)以S2 中4 个相邻特征图子集为输入。

然后,接下来的3 个特征图(对应上图第3 个红框的3 列)以S2 中不相邻的4 个特征图子集为输入,C3 中的最后一个特征图对应上图第4 个红框的1 列将S2 中所有特征图为输入。这里得到的每一个特征图为多核多通道卷积,将每一列称为一个卷积核,它由若干个卷积模板构成,因为是多个卷积核模板卷积的结果得到一个特征图,仍然认为是一个卷积核,所以每列只有一个偏置参数。之所以采取这种组合方式,LeCun 主要是基于以下两点考虑:减少参数;采用不对称的组合连接方式有利于提取多种组合特征。

5. S4 层

S4 层为下采样层,即池化层,窗口大小为2×2,包括16 个特征图,C3 层的16 个10×10 的特征图分别进行以2×2 为单位的池化得到16 个5×5 的特征图,步长为2,即本网络层的输出张量大小为5×5×16,一共有5×5×5×16=2000 个连接,连接的方式与S2 层类似。

6. C5 层

C5 层是一个卷积层,输入为S4 层的全部16 个特征图,该层卷积原理与普通卷积层一致,只是因为恰巧卷积核大小与输入特征图尺寸一样,因此得到一维,即1×1(5-5+1)的输出,卷积核种类为120,得到120 维的卷积结果,每个都与上一层的16 个特征图相连,因此一共有(5×5×16+1)×120=48 120 个可训练参数。

7. F6 层

F6 层是全连接层,采用全连接的方式与C5 层连接,由对C5 层的输入乘以权重加上偏置,结果通过激活Sigmoid 函数输出。F6 层有84 个节点,对应于一个7×12 的比特图,-1 表示白色,1 表示黑色,这样每个符号的比特图的黑白色对应一个编码,F6 层的训练参数/ 连接数为(120+1)×84=10 164。

8. Output 输出层

Output 输出层同样是全连接层,共有10 个节点,分别代表数字0~9,且如果节点i 的值为0,则网络识别的结果是数字i。采用的是径向基函数(RBF)的网络连接方式。假设x 是上一层的输入,y 是RBF 的输出,则RBF 输出的计算方式如式(11-1)所示。

式中wij 的值由i 的比特图编码确定,i 取值为0~9,j 取值为0~(7*12-1)。RBF 输出的值越接近于0,表示当前网络的输入越接近于i,即越接近于i 的ASCII 编码,该层一共包含84×10=840 个可学习参数。卷积神经网络在本质上是在不需要获取输入和输出之间精确的数学表达的情况下,学习从输入数据到目标输出的复杂映射,卷积神经网络的优势在于能够很好地利用图像的二维结构信息,LeNet-5 在银行支票手写体字符识别问题上得到成功应用。

不考虑输入层,LeNet-5 是一个7 层的网络,卷积层的参数较少,这得益于卷积层的若干重要特性,即局部连接和共享权重。现在常用的LeNet-5 结构和Yann LeCun 教授在1998 年论文中提出的结构在某些细节上存在一定的区别,如激活函数的使用,现在一般使用ReLU 作为激活函数,而输出层一般选用Softmax。CNN 能够提取原始图像的有效表征,这赋予CNN 经过较少的预处理,即可从原始像素中学习和识别视觉规律的能力。然而,由于LeNet-5 提出伊始,缺乏大规模的训练数据,计算机的计算能力也难以满足要求,CNN 的网络架构在不同文献中的描述略有差异。

不过,CNN 的基本组成单元和模块相对一致,可以像搭积木一样将不同功能的网络层组合起来,从而实现规模更大、深度更深的网络。因此,从某种意义上说,CNN 或深度学习中的网络层本质上是能够进行信息处理的积木单元。LeNet-5 对于更复杂问题的处理效果并不理想,但通过对LeNet-5 的网络结构的分析与研究,可以直观地了解卷积神经网络的构建方法,能够为分析和构建更复杂、更深层的卷积神经网络打下坚实的基础。

总结卷积神经网络的成功经验,主要在于局部连接(LocalConnection)、权值共享(Weight Sharing)和池化层(Pooling)中的降采样(Down-Sampling)。

(1)卷积层(Convolutions Layer)。卷积层由很多的卷积核(Convolutional Kernel)组成,卷积核用来计算不同的特征图,卷积层是卷积神经网络的核心。在图像识别里用到的卷积是二维卷积,具体是二维滤波器滑动到二维图像上所有位置,并在每个位置上与该像素点及其领域像素点做内积。卷积操作被广泛应用于图像处理领域,不同类型的卷积核可以提取图像不同类型的特征,例如,边缘、角点等特征。在深层卷积神经网络中,通过卷积操作可以提取出图像低级简单到抽象复杂的特征,学习输入数据具有较强普适性的特征表达。除此之外,激活函数能够为CNN 卷积神经网络引入非线性,增强网络的复杂建模能力,常用的非线性激活函数有Sigmoid、Tanh 和ReLu 等,前两者常见于全连接层,后者ReLu 则多用于卷积层。

(2)池化层(Pooling Layer)。池化是非线性下采样的一种形式,主要作用是通过减少网络的参数来减小计算量,同时池化层能降低卷积层输出的特征向量,通常在卷积层的后面会加上一个池化层,通过卷积层与池化层交替使用可以获得更复杂的高层抽象特征,并且能够在一定程度上避免和缓解过拟合现象。常用的池化操作包括最大池化、平均池化等,其中最大池化是用不重叠的矩形框将输入层分成不同的区域,对于每个矩形框内的数值取最大值作为统计输出。

(3)全连接层(Full Connected Layer)。如果说卷积层、池化层和激活函数映射等操作是将原始数据映射到隐层特征空间的话,那么全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用,将多层的特征表达拉直成一个一维的向量,实现神经网络的高层抽象推理能力,在整个卷积神经网络中起到“分类器”的作用。

(4)局部连接(Local Connection)。局部连接指的是每个神经元仅与输入神经元的一块区域相连,该局部区域也被称为感受野(Receptive Field)。局部连接的思想可追溯至生物学里面的视觉系统结构,即视觉皮层的神经元实质上是局部接收信息的。在图像卷积操作中,神经元在空间维度上是局部连接的,但在深度上是全部连接的。对于二维图像本身而言,局部像素关联较强,这种局部连接保证了学习后的过滤器能够对于局部的输入特征有最强的响应。

(5)权重共享(Weight Sharing)。实际中,图像的底层边缘特征与特征在图中的具体位置无关,即特征可能出现在图像的任意位置,权重共享正是利用这一特点,具体是指卷积核内权重参数被整张图共享,而不会因图像内位置的不同而改变,可在图像中的不同位置学习到同样的特征,权重共享可以在很大程度上减少参数数量。

LeNet-5 的TensorFlow 实现

前文介绍了LeNet-5 的基本网络结构,以及各个网络功能层的特点与作用,本节将利用TensorFlow 具体实现这一网络。首先需要说明以下几点。

(1)LeNet-5 主要采用Tanh 和Sigmoid 作为非线性激活函数,但相对这两者采用ReLu 激活函数的卷积神经网络更加有效。

(2)LeNet-5 采用平均池化作为下采样操作,但是目前最大池化操作应用更为广泛。

(3)LeNet-5 网络最后一层采用Gaussian 连接层,用于输出0~9 这10 个类别中的一类,但是目前分类器操作已经被Softmax 层取代。

第1 步:建立config.py 文件,可以将超参数设置在config.py 中,方便后期对模型进行调整。代码实现与说明如程序清单11-1 所示。

程序清单11-1 config.py 文件建立及超参数设置

1. """2. 设置模型的超参数3.4.5. KEEP_PROB: 网络随机失活的概率6. LEARNING_RATE: 学习的速率,即梯度下降的速率7. BATCH_SIZE: 一次训练所选取的样本数8. PARAMETER_FILE: 模型参数保存的路径9. MAX_ITER: 最大迭代次数10. """11.12. KEEP_PROB = 0.513. LEARNING_RATE = 1e-514. BATCH_SIZE =5015. PARAMETER_FILE = "checkpoint/variable.ckpt"16. MAX_ITER = 50000

第2 步:构建LeNet 模型的LeNet.py 文件,建立一个名为Lenet 的类,类中实现模型的初始化与构建,代码实现与说明如程序清单11-2 所示。

程序清单11-2 构建LeNet 模型与LeNet.py 文件

1. import tensorflow as tf2. import tensorflow.contrib.slim as slim3. import config as cfg4.5. class Lenet:6. def __init__(self):7. """8. 初始化LeNet 网络9. """10. # 设置网络输入的图片为二维张量,数据的类型为float32,行数不固定,列固定为78411. self.raw_input_image = tf.placeholder(tf.float32, [None, 784])12.13. # 改变网络输入张量的形状为四维,-1 表示数值不固定14. self.input_images = tf.reshape(self.raw_input_image, [-1, 28, 28, 1])15.16. # 设置网络输入标签为二维张量,数据类型为float,行数不固定,列固定为1017. self.raw_input_label = tf.placeholder("float

卷积后的特征有负数吗?_赠书 | 人工智能识万物:卷积神经网络的前世今生相关推荐

  1. 赠书 | 人工智能识万物:卷积神经网络的前世今生

    来源 |<Python人工智能开发从入门到精通> 作者 | 杨柳.郭坦.鲁银芝 责编 | 晋兆雨 深度学习在技术与应用上的突破引发了第三次人工智能浪潮,获得了空前成功.在前述章节的基础上, ...

  2. java 坦克机器人_[转]人工智能 Java 坦克机器人系列: 神经网络,下部

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 贝叶斯网络 贝叶斯网络亦称信念网络(Belief Network),于 1985 年由 Judea Pearl 首先提出.它是一种模拟人 ...

  3. 卷积神经网络的前世今生

    来源 |<Python人工智能开发从入门到精通> 作者 | 杨柳.郭坦.鲁银芝 责编 | 晋兆雨 深度学习在技术与应用上的突破引发了第三次人工智能浪潮,获得了空前成功.在前述章节的基础上, ...

  4. 可视化卷积神经网络的过滤器_万字长文:深度卷积神经网络特征可视化技术(CAM)最新综述...

    ↑ 点击蓝字 关注极市平台作者丨皮特潘@知乎来源丨https://zhuanlan.zhihu.com/p/269702192编辑丨极市平台 极市导读 本文通过引用七篇论文来论述CAM技术,对CAM的 ...

  5. 对pca降维后的手写体数字图片数据分类_机器学习:数据的准备和探索——特征提取和降维...

    在数据的预处理阶段,特征提取和数据降维是提升模型表示能力的一种重要手段. 特征提取主要是从数据中找到有用的特征,用于提升模型的表示能力,而数据降维主要是在不减少模型准确率的情况下减少数据的特征数量. ...

  6. 函数或变量 rtenslearn_c 无法识别_深度学习的数学-卷积神经网络的结构和变量关系...

    前言 本篇博客主要介绍卷积神经网络的组成部分,以及变量表示,最后附上卷积神经网络代价函数的计算 正文 前文中学到的神经网络都是全连接类型的,隐藏层对输入层有着各自固定的偏好模式,满足偏好模式(权重和偏 ...

  7. 卷积神经网络训练准确率突然下降_基于联邦学习和卷积神经网络的入侵检测方法...

    王蓉1,马春光2,武朋2 1. 哈尔滨工程大学计算机科学与技术学院,哈尔滨 150001:2. 山东科技大学计算机科学与工程学院,青岛 266590 doi :10.3969/j.issn.1671- ...

  8. 超详细的卷积后大小的计算公式

    计算公式定义 定义几个参数 输入图片大小 W×W 卷积核大小 F×F 步长 S padding的像素数 P 于是我们可以得出计算公式为: N = (W − F + 2P )/S+1 输出图片大小为 N ...

  9. 卷积运算和特征图的理解

    卷积运算和特征图的理解 卷积核在原图相应位置按指定步长滑动,做内积(相乘再相加再加上偏置) 如下图左边,输入图像为7×7×3, 3个数字矩阵分别代表RGB三通道,因此卷积核也必须是三通道的,这里使用3 ...

最新文章

  1. python进程socket通信_Python Socket TCP双端聊天功能实现过程详解
  2. Dubbo 注解驱动(Annotation-Driven)
  3. wget安装Jenkins
  4. Ivan Fedorov:用已知无法想象未来 - Mixin Network开发者访谈
  5. 不同类型的官网应该如何设计?
  6. 嘉峪关计算机网络优化,嘉峪关广播电视大学计算机网络技术专业_甘肃报名_网络教育计算机网络技术专业教学计划_中国教育在线...
  7. filters获取data中的数据
  8. python传递参数*与**
  9. 天正CAD启动时显示服务器名称为空,如何解决天正建筑2014启动时出现error
  10. 智慧城市运营典型模式特征分析
  11. 三维可视化常见的技术路线浅析
  12. ORAN接收窗监测和UL U平面发送窗
  13. 第四届互联网+市赛后总结
  14. 3d打印模型为什么文件格式必须是stl和stp的?
  15. 脱胎于沃尔沃的Polestar 2浮出水面,它真能挑战Model 3吗?
  16. 比较器的简单介绍及应用
  17. 【盲解调】基于频率和滤波器参数估计的FH-GFSK调制信号盲解调算法matlab仿真
  18. OUC软件开发实验5
  19. 【好奇心驱动力】e-paper电子价签从零开始折腾记录
  20. 从360大战QQ看未来云计算和云存储

热门文章

  1. C语言保留小数相关问题
  2. 关于立创EDA使用的几点心得
  3. v4跨界战显示服务器维护中,V4跨界战手游预约-V4跨界战游戏首发预约_第一手游网...
  4. vue权限路由实现的方法示例总结
  5. U盘、硬盘插入没反应,右下角有设备但我的电脑里没有
  6. 逻辑回归损失函数为什么引入log?
  7. 国内首部《区块链安全生存指南》联合发布
  8. Linux内核驱动-Kconfig和Makefile
  9. win10下执行Hadoop命令报错:系统找不到指定的路径。Error: JAVA_HOME is incorrectly set. Please update D:\
  10. 删除右键菜单中的Git