深度学习是近十年来人工智能领域取得的重要突破。它在语音识别、自然语言处理、计算机视觉、图像与视频分析、多媒体等诸多领域的应用取得了巨大成功。至今已有数种深度学习方法,如卷积神经网络(CNN)、自编码神经网络(包括Auto encoder和Sparse Coding)和深度置信网络(DBN),并在各个领域中取得了极好的效果。
其中较为火热的图像分类技术已经被广泛应用在人脸识别和面部表情识别中,是计算机视觉的核心问题之一。图像分类是从固定的一组分类中分配输入图像一个标签的任务,在本案例中,我们将以Fashion-MNIST图像数据集为例,了解并使用不同的神经网络模型来对其进行分类,并比较不同网络的预测效果。
本案例的学习分为三个部分,首先是目标问题的数据集介绍,了解数据背景是解决问题的重要前提;接着,我们会介绍基本的逻辑回归模型,在此基础上引入本案例的核心——卷积神经网络。在第三部分中,我们将会介绍若干种比较流行的卷积神经网络,分别从这些网络的结构和预测效果来对不同的模型进行比较。
背景介绍
说到图像识别,想必大家对MNIST-Image手写数据集都不陌生。这个数据包含60000个示例的训练集以及10000个示例的测试集。由于它的数据量小、识别任务简单而成为图像识别入门的第一课。但是由于其计算量小,识别难度较低(很多深度学习算法在这个测试集上的准确率已经达到99.6%),能在该数据集上有较好表现的模型并不一定能用在更复杂的图片识别中。深度学习框架Keras的创建者François Chollet在Twitter上说道:“在MNIST上看似有效的想法没法迁移到真正的机器视觉问题上。”
图片来源请 参考这里。
因此,产生了一个替代MNIST手写数字集的图像数据集:Fashion-MNIST,其涵盖了来自10种类别的共7万个不同商品的正面图片,由Zalando(一家德国的时尚科技公司)旗下的研究部门提供。Fashion-MNIST的图像大小、格式和训练集/测试集划分与原始的MNIST完全一致:60000/10000的训练测试数据划分,28x28的灰度图片。
图片来源请 参考这里。
该数据集的样本均衡,每个类别6000个样本;分类目标也清晰直观,即将7万张不同的图片划分为10种类别。每一类的图像大致特征如下:
逻辑回归
首先,为了使得后续的建模较为清晰明了,我们在所有的模型建立之前进行以下准备工作:
- 导入深度学习框架tensorflow、keras、python 模块 scikit-learn(简称sklearn)等;
- 实现辅助函数,本案例接下来将会多次使用卷积核权重参数的可视化和CNN训练结果的可视化,因此提前定义相应函数;
提到分类问题,我们首先想到的应该是逻辑回归,逻辑回归能对图像分类吗?答案是当然可以。那逻辑回归和神经网络有什么关系呢?实际上,我们可以将逻辑回归看作仅含有一个神经元的单层(全连接层)神经网络:
当二分类问题扩展为多分类问题时,常用的是Softmax逻辑回归。首先,我们了解一下什么是Softmax函数。Softmax函数,或称归一化指数函数,是逻辑函数的一种推广,它能将一个含任意实数的 K 维向量 $η$
“压缩”到另一个K维实向量 $\Phi = \sigma (\eta)$
中,使得每一个元素的范围都在(0,1)之间,并且所有元素的和为1,函数形式为:
\begin{equation} \phi_{j}=\frac{e^{\eta_{j}}}{\sum_{k=1}^{K} e^{\eta_{k}}}, \mathrm{j}=1, \ldots, \mathrm{K} \end{equation}
多分类模型的输出结果为该样本属于K个类别的概率,从这K个概率中我们选择最优的概率对应的类别(通常选概率最大的类别),作为该样本的预测类别。根据广义线性模型的假设
\begin{equation} \eta_{j}=\theta_{j}^{T} x \end{equation}
所给模型在给定 x 的条件下 y 的分布
\begin{equation} \mathrm{P}(\mathrm{y}=\mathrm{i} \mid \mathrm{x} ; \theta)=\frac{e^{\theta_{j}^{T} x}}{\sum_{k=1}^{K} e^{\theta_{k}^{T} x}} \end{equation}
通过最大化似然函数来求解最优参数,计算K个概率进行分类。
Softmax回归是多维的逻辑回归,它其实可以看作单层(全连接层)多个神经元的神经网络:
我们对Fashion-MNIST数据集进行最基本的Softmax回归,自变量在“拉直”后为28x28=784维的像素点向量,因变量为10个类别。Softmax回归的预测结果在85%左右,这实际上是一个比较高的准确率。接着我们将全连接层的权重参数值转换为28x28的矩阵并绘制矩阵热图,从该层的权重矩阵可以看出一些轮廓。
观察Softmax逻辑回归的混淆矩阵,可以看出第6类服装的错误率最高,而误判为第6类的主要为第0、2、4类。我们观察这几类图片,发现它们长得确实很像,因此逻辑回归的错判也是可以理解的。
卷积神经网络
卷积神经网络概述
在了解卷积神经网络之前,我们先简单了解最基本的神经网络。神经网络其实就是按照一定规则连接起来的多个神经元,输入向量的维度和输入层(Input Layer)神经元个数相同,分类问题的类别个数决定了输出层(Output Layer)的神经元个数。第N层的神经元与第N-1层的所有神经元连接,称为全连接。输入层和输出层之间的层叫做隐藏层(Hidden Layer),因为它们对于外部来说是不可见的,层与层的每条连接上都有一个权值。
然而,用全连接神经网络处理大尺寸图像具有三个明显的缺点:
- 首先,将图像展开为向量会丢失临近像素的空间信息;
- 其次,模型参数过多,因此效率低下,训练困难;
- 同时,大量的参数也很快会导致网络过拟合。
针对这些问题,人们提出了卷积神经网络,从而很好地解决了上面的三个问题。
与常规神经网络不同,卷积神经网络的各层中的神经元是3维排列的:宽度、高度和深度(这个深度指的是某层数据的第三个维度,而不是整个网络的深度,整个网络的深度指的是网络的层数)。下图是一个卷积神经网络,它的神经元被排列在3个维度(宽、高和深度)。卷积神经网络的每一层都将3维的输入数据变化为神经元3维的激活数据并输出。在下图中,红色的输入层代表输入图像,所以它的宽度和高度就是图像的宽度和高度,它的深度是3(代表了RGB 3种颜色通道)。图中红色右边的蓝色部分是经过卷积运算(convolution)和池化运算(Pooling)之后的激活值(也可以看作一层神经元) ,后面是接着的下一部分卷积池化层,最右边绿色的部分是一个深度为分类个数的输出向量。
卷积神经网络主要由这几类层构成:输入层、卷积层(Convolution),激活函数(Activation,CNN中一般使用ReLU函数)、池化(Pooling)层和全连接层(Fully Connected Layer,全连接层相当于一个普通神经网络)。通过将这些层叠加起来,就可以构建一个完整的卷积神经网络。因为卷积后面一般会跟着ReLU,因此在很多示意图中常常将ReLU忽略。
具体说来,卷积层和全连接层(CONV/FC)对输入执行变换操作的时候,不仅会用到激活函数,还会用到很多参数,即神经元之间连接的权值矩阵W和偏差b;而激活函数和池化层则是进行一个固定不变的函数操作。卷积层和全连接层中的参数会通过梯度下降被训练,这样卷积神经网络计算出的分类评分就能和训练集中的每个图像的标签逐渐相符了。
卷积层与卷积计算
卷积层是构建卷积神经网络的核心层,它占据了网络中大部分的计算。在处理图像这样的高维度输入时,让每个神经元都与前一层中的所有神经元进行全连接是不现实的。相反,我们让每个神经元只与输入数据的一个局部区域连接,这个过程是离散卷积运算。
离散卷积运算(Discrete Convolution)是一种对输入数据的线性变换,这种运算具有稀疏的性质(每个输出单元的产生只包含了一部分输入单元信息),并且重复利用参数(对输入数据的多个位置使用同一组权值参数)
如上图所示,整个浅蓝色5x5矩阵被称作输入特征图(Input Feature Map),阴影覆盖的深蓝色部分为3x3的卷积核(Kernel,也叫做滤波器Filter),取值为:
$$ \left(\begin{array}{lll}{0} & {1} & {2} \ {2} & {2} & {0} \ {0} & {1} & {2}\end{array}\right) $$
卷积核滑过输入特征图,滑动到每一个位置时,卷积核中的每个元素与其覆盖的阴影部分输入数据对应位置的每个元素做乘积再求和,得到表示当前位置的输出数据(对应右边绿色阴影部分的数字),在全部滑动位置都计算完成后,就得到了绿色的输出矩阵,也叫做输出特征图(Output Feature Map)。我们以3x3的输入数据X、2x2的卷积核W和2x2的输出矩阵Y为例,通过公式来表示卷积运算:
$$ \mathrm{X}=\left(\begin{array}{lll}{x_{11}} & {x_{12}} & {x_{13}} \ {x_{21}} & {x_{22}} & {x_{23}} \ {x_{31}} & {x_{32}} & {x_{33}}\end{array}\right)_{3 * 3} $$
$$ W=\left(\begin{array}{ll}{W_{11}} & {W_{12}} \ {W_{21}} & {W_{22}}\end{array}\right) $$
将卷积核扩展为4x9的稀疏矩阵C:
$$ \mathrm{C}=\left(\begin{array}{cccc}{w_{11}} & {0} & {0} & {0} \ {w_{12}} & {w_{11}} & {0} & {0} \ {0} & {w_{12}} & {0} & {0} \ {w_{21}} & {0} & {w_{11}} & {0} \ {w_{22}} & {w_{21}} & {w_{12}} & {w_{11}} \ {0} & {w_{22}} & {0} & {w_{12}} \ {0} & {0} & {w_{11}} & {0} \ {0} & {0} & {w_{12}} & {w_{11}} \ {0} & {0} & {0} & {w_{12}}\end{array}\right)_{9 * 4} $$
并将X拉直为9x1的矩阵,则 $Y'=CX$
为4x1矩阵,再将 Y' 重塑(Reshape)为2x2的大小即为输出矩阵 Y。
当我们使用不同的卷积核重复上述卷积运算,则可以得到同样多的输出特征图,也称为输出通道(Output Channels)。如果有多个输入通道(Input Channels)——以图片具有RGB 3个输入通道为例,对每一个输入通道(即每一个输入特征图)使用一个特定的卷积核进行如上的卷积计算,输出3个特征图,将这3个输出特征图对应位置的元素相加,计算出这一个输入通道对应的输出特征图。卷积核的数量与输出特征图的数量相同,每个输出特征图表示一个输出通道,从而,多个输入通道通过卷积计算就得到多个输出通道。
图片来源请 参考这里。
二维卷积计算可以推广到N维,例如在三维卷积计算中,卷积核是一个立方体,并且会沿着输入特征图的长、宽、深滑动。
此外,卷积层的如下性质会影响输出特征图的尺寸:
-
输入特征图尺寸
-
卷积核尺寸
-
步长(Stride):两个连续的卷积核位置之间的距离
-
零填充(Zero Padding):输入特征图邻接填充的0的行/列数
我们举几个栗子来了解卷积层的上述性质:
图片来源请 参考这里
ReLU激活函数也应该算是一层,它逐元素地进行激活函数操作,但一般将它与卷积层看作是同一层。
池化层
池化层也称为下采样层(Subsampling)通常在连续的卷积层之间会周期性地插入一个池化层。它的作用是逐渐降低数据体的空间尺寸,这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。池化操作一般有两种,一种是均值池化(Average Pooling),一种是最大池化(Max Pooling),后者更为常见。如果滤波器是2x2的尺寸,则每个最大池化操作是从4个数字中取最大值(也就是在深度切片中某个2x2的区域),深度保持不变。
图18所示为最大池化方法,其中,每个滤波器(对应每一种颜色)选择其覆盖的像素点中最大的数字,从而得到池化计算后的结果。
全连接层
连接所有的特征,将输出值送给激活函数(如Softmax、ReLU等,从而进行分类)。
在介绍具体的神经网络之前,让我们先了解一些重要术语。
参数初始化方法(Initializer)
初始化方法定义了对Keras设置初始化权重的方法,通过参数 kernel_initializer
来指定,如果不特殊指定,则默认为Glorot Uniform
初始化方法(详细参数设置可参考 Keras官方文档)。
(1)常数初始化:参数初始化为固定值;
(2)正态分布类初始化:参数来自于指定均值和标准差的正态分布,包括截尾正态分布初始化、VarianceScaling、LeCun正态分布、Glorot正态分布和He正态分布初始化方法;
(3)均匀分布类初始化:参数来自于指定上下界的均匀分布,包括VarianceScaling、Lecun均匀分布、Glorot均匀分布和He均匀分布初始化方法;
(4)矩阵相关的初始化方法:包括使用随机正交矩阵初始化和单位矩阵初始化(仅适用于二维方阵)的方法;
Epoch
使用训练集的全部数据对模型进行一次完整的训练,称为一个epoch。
Batch
使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称作batch。
迭代
迭代是重复反馈的动作,神经网络中我们希望通过迭代进行多次的训练以实现更高的预测准确率。每一次迭代得到的结果都会被作为下一次迭代的初始值,一个迭代包含一次正向训练和一次反向传递。
到底是啥意思呢?让我们再举个栗子:对于一个有5000个训练样本的数据:将5000个样本分成大小为500的batch,那么在对参数进行初始化后,训练完整个样本集需要10次迭代,1个epoch。
我们使用的是有限的数据集,并且我们使用一个迭代过程——梯度下降来优化学习过程。因此仅仅更新权重一次或者说使用一个 epoch 是不够的。随着 epoch 数量增加,神经网络中的权重的更新次数也增加,曲线从欠拟合变得过拟合,数据的多样性会影响合适的 epoch 的数量。
整体的网络结构也可以通过这个简化的VGG来理解(这个网络我们会在后面进一步学习)。
图片来源请 参考这里
卷积神经网络搭建
一层卷积神经网络
首先我们从一些常见的网络结构入手。搭建单层的卷积神经网络:INPUT -> CONV -> RELU-> POOL -> FC -> OUTPUT,将epoch设置为10,batch size设置为100,对Fashion-MNIST图像数据进行预测。通过构建单层的神经网络,预测精度已经可以达到90%,我们观察右图中训练出的coat类的16个图像,都具有十分明显的外套特征。
两层卷积神经网络
构建两层神经网络:INPUT -> CONV -> RELU -> CONV -> POOL -> FC -> OUTPUT。在两层神经网中,我们仅设置epoch为2,就已经可以达到87%的预测准确度。绘制拟合正确的20个T-shirt/Top图像,可以明显地观察到轮廓;当我们把epoch增加到10时(和一层神经网络设置一致),预测精度可以达到92%左右。
CNN进阶
掌握了比较基础的卷积神经网络,我们进一步学习更加复杂,也非常流行、有名的几种结构:LeNet、AlexNet、VGG和ResNet。
LeNet-5
LeNet-5模型是Yann LeCun教授于1998年在论文中提出的(LeCun, Y. et al., 1998),它是第一个成功应用于数字识别问题的卷积神经网络。
LeNet-5共有7层(不包含输入),每层都包含可训练参数。在训练整个网络之前,对28x28的图像加上零填充,转换为32x32的输入数据。C1层为卷积层,使用6个卷积核得到响应的输出通道;S2层为池化层,采用最大池化的方法,池化尺寸为2x2;C3层为卷积层,使用16个不同的卷积核;S4层仍然为池化层,采用2x2的最大池化方法;C5层为卷积层,使用120个卷积核,输出120个1x1的特征图;F6层与C5层全连接,输出层与F6层全连接。
AlexNet
在2012年的ImageNet竞赛中,继LeNet-5之后的第二个经典CNN网络——以超出第二名10%以上的top-5准确率,勇夺ImageNet2012分类比赛的冠军。
首先我们了解一下ImageNet数据集。它是一个数据量超过1500万的图像数据集,大约有22,000类,这个数据集由李飞飞团队从2007年开始,耗费大量人力,通过各种方式(网络抓取,人工标注,亚马逊众包平台)收集制作而成,作为论文在CVPR-2009发布。通常说的ImageNet比赛指的是ImageNet Large-Scale Visual Recognition Challenge,简称ILSVRC,使用的数据集是ImageNet数据集的一个子集,一般说的ImageNet实际上指的是ImageNet的这个子集。以2012年为例,比赛的训练集包含1281167张图片,验证集包含50000张图片,测试集为100000张图片。
ILSVRC竞赛的项目主要包括这几个问题:(1)图像分类与目标定位(CLS-LOC)(2)目标检测(DET)(3)视频目标检测(VID)(4)场景分类(Scene),且接下来介绍的几种网络结构在第一类问题中有相当出色的表现。
传统方法在图像检索技术上一直表现平平。比如传统方法常用的尺度不变特征变换(Scale-invariant feature transform,SIFT),SIFT特征是图像的局部特征,对一定程度内的缩放、平移、旋转、视角改变、亮度调整等畸变,都具有不变性,是过去最重要的图像特征提取方法之一。然而SIFT这类算法提取的特征还是有局限性的,在ImageNet ILSVRC比赛的最好结果的错误率也有26%以上,而且常年难以产生突破。而图像检索的发展目标是希望模型又快又准,因此兴起了基于CNN的方法,如AlexNet、VGG和ResNet等。
其中,图像分类的任务是要判断图片中物体在1000个分类中所属的类别,主要采用top-5错误率的评估方式,即对于每张图给出5次猜测结果,只要5次中有一次命中真实类别就算正确分类,最后统计没有命中的错误率。
AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的,是CNN向大规模应用打响的第一枪,宣告神经网络的王者归来。它的性能远远超出第二名(在图像分类问题中具有16%的top5错误率,第二名是26%的top5错误率)。这个网络的结构比LeNet-5更深更大,并且使用了层叠的卷积层来获取特征。
AlexNet为8层结构,其中前5层为卷积层,后面3层为全连接层;学习参数有6千万个,神经元有650,000个。与之前的深度学习网络结构相比,它是如何让错误率明显降低的呢?
图片来源请 参考这里
- ReLU激活函数:LeNet-5使用的是tanh激活函数,实验结果表明,要将深度网络训练至错误率达到25%的话,使用ReLU只需5个epochs的迭代,但使用tanh单元则需要35个epochs的迭代,即用ReLU比tanh在训练的速度上快6倍,并且ReLU激活函数能有效减轻深层CNN网络训练时梯度消失的问题。
- Overlapping pooling:指池化单元在总结提取特征的时候,其输入会受到相邻池化单元的输入影响,也就是提取出来的结果可能是有重复的(对最大池化方法而言)。
- 数据增强(Data Augmentation):增强图片数据集最简单和最常用的方法是在不改变图片核心元素(即不改变图片的分类)的前提下对图片进行一定的变换,比如在垂直和水平方向进行一定的平移、翻转等,相当于进一步扩大了数据集,防止过拟合。
- Dropout:一般用在全连接层后,作为一个正则化器(regularizer),在训练时从神经网络中随机丢弃神经元(与其连接),能有效防止网络过拟合。
在我们的Fashion-MNIST数据实验中,设置20个epochs,batch size为100,并在更新参数时使用0.5的概率随机丢弃对应层的神经元(与其连接),未使用数据增强技巧来训练AlexNet,可以得到97%的预测准确率,相较于简单的神经网络已经有了相当大的提升。
VGG
VGG是ILSVRC-2014中定位任务第一名和分类任务第二名。其突出贡献在于证明使用很小的卷积核(receptive window size)(3*3),并增加网络深度也可以有效提升模型的效果,而且VGG对其他数据集具有很好的泛化能力。
与AlexNet不同,VGG在网络中使用很小的卷积。AlexNet在第一个卷积层的卷积是步长为4的11x11卷积核,第二个卷积层用5x5尺寸的卷积核,但VGG则全部使用3x3尺寸的卷积核。我们通过一个简单的计算来说明小尺寸的卷积核计算效率更高:
由于2个堆积的3x3卷积核与1个5x5卷积核是同样有效的(如下图所示),因此我们比较这两种卷积方法的计算效率。假设输入通道与输出通道都为C,则堆积的3x3卷积核需要计算的权值参数数量为2x(3x3)C=18C,而较大卷积核的参数数量为1x(5x5)=25C。同理,3个堆积的3x3卷积核与1个7x7卷积核效果相同,但7x7卷积核需要计算的权值参数比小尺寸的卷积核多81%。因此,使用3x3的小卷积核减少了模型储存空间的使用,大大提高了计算效率。
以VGG-16为例,训练时输入大小为224x224的RGB图像,经过一系列卷积层处理,在卷积层中使用了步长为1的3x3卷积核,池化层采用max-pooling最大池化方法。一系列卷积层之后跟着全连接层,且所有隐藏层都使用ReLU激活函数。
为了计算简洁,我们搭建了仅有6个卷积层与3个全连接层的9层VGG,在我们的Fashion-MNIST数据实验中,设置20个epochs,batch size为100,预测准确率仍然高达97%左右。在同样的预测精度下,与AlexNet相比,VGG的训练时间大大缩短,平均每个epoch只需要5秒左右,而AlexNet平均每个epoch需要大约20秒,因此VGG高效的计算更适用于大体量的复杂数据中。
ResNet
但是更深的网络其性能一定会更好吗?实验发现深度网络出现了退化问题(Degradation problem):网络深度增加时,网络准确度出现饱和,甚至出现下降。
何恺明博士提出了残差学习来解决退化问题。对于一个堆积层结构(几层堆积而成)当输入为x时其学习到的特征记为 $H(x)$
,现在我们希望其可以学习到残差 $F(x)=H(x)-x$
,这样其实原始的学习特征是$F(x)+x$
,之所以这样是因为残差学习相比原始特征直接学习更容易——当一部分卷积权重接近于0的时候,这部分卷积层就相当于被跳过了,整体来看这个网络就近似于一个较浅的网络。当残差为0时,此时堆积层仅仅做了恒等映射,至少网络性能相对于原始特征直接学习不会下降;实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。残差学习的结构如下图所示。这有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。
上图表示两种ResNet的设计,一般称整个结构为一个神经网络块(Building Block),以上图右边的设计为例(又称为Bottleneck Design),第一个1x1的卷积把256维输入通道降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。对于常规ResNet设计(上图左),可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如50、101和152层这样的网络中,目的是减少计算和参数量。
以101层网络ResNet-101为例,首先对输入做7x7x64的卷积,然后经过3 + 4 + 23 + 3 = 33个网络块,每个网络块为3层,所以有33 x 3 = 99层,最后有一个全连接层(用于分类),所以1 + 99 + 1 = 101层 我们来看一下ResNet网络与其他网络在ImageNet上的对比结果,如下图所示。可以看到ResNet-152其误差降到了4.49%。
同样地,我们使用Fashion-MNIST数据集对ResNet进行训练,同样设置batch size为100和20个epochs,预测的准确率已经可以提升至99%左右。
结语
通过本次学习,我们掌握了基本的神经网络结构和核心概念,并在此基础上了解了深度学习领域中应用非常广泛的卷积神经网络结构,以及几种更为复杂和流行的卷积神经网络——LeNet-5、AlexNet、VGG和ResNet,并使用Fashion-MNIST数据集对这几种网络结构的预测精度进行了比较。
卷积神经网络在计算机视觉任务中有很广泛的应用,包括图像分类、物体检测、物体追踪、文本检测、动作识别和场景标签等,除此之外,自然语言处理领域也对CNN有较为成熟的应用。本文可以作为神经网络的入门学习文档,帮助大家进一步了解深度学习的发展现状。
参考文献
[1] Zhang, Q., Zhang, M., Chen, T., Sun, Z., Ma, Y., & Yu, B. (2019). Recent advances in convolutional neural network acceleration. Neurocomputing, 323, 37-51.
[2] LeCun, Y., Bottou, L., Bengio, Y., & Haffner, P. (1998). Gradient-based learning applied to document recognition. Proceedings of the IEEE, 86(11), 2278-2324.
[3] Srivastava, N. (2013). Improving Neural Networks with Dropout.
[4] Krizhevsky, A., Sutskever, I., & Hinton, G. E. (2012). Imagenet classification with deep convolutional neural networks. In Advances in neural information processing systems (pp. 1097-1105).
[5] He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep residual learning for image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 770-778).
[6] Géron, A. (2017). Hands-on machine learning with Scikit-Learn and TensorFlow: concepts, tools, and techniques to build intelligent systems. " O’Reilly Media, Inc.".