㈠ 为什么不同的机器学习领域都可以使用CNN,CNN解决了这些领域的哪些共性问题是如何解决的
卷积神经网络 (CNN) 是一种神经网络,特别适用于涉及处理和分析具有网格状结构的数据(如图像)的任务。CNN能够通过对数据应用一组学习的过滤器来处理和分析图像,这使他们能够学习不同尺度的特征和模式,并自动识别图像中的对象和特征。
CNN在各种任务上取得成功的关键原因之一是因为它们能够自动从数据中学习特征,这使他们能够在各种任务上表现良好,而无需大量的手动调整或特征工程。这对于图像分类、对象检测和分割等任务特别有用,在这些任务中,模型需要能够识别和分类图像中的对象和特征。
CNN被广泛使用的另一个原因是,它们能够在整个输入中使用共享权重和偏差来有效地处理数据,这使他们能够学习与整个输入相关的特征。这对于图像分类等任务特别有用,在这些任务中,模型需要能够识别和分类对象和特征,而不管它们在图像中的位置如何。
总体而言,CNN在广泛的任务上取得了成功,因为它们能够自动从数据中学习特征,并且因为它们能够在整个输入中使用共享权重和偏差来有效地处理数据。这使它们成为涉及处理和分析具有网格状结构的数据(如图像)的任务的强大工具。
㈡ 卷积神经网络Convolutional Neural Network(CNNs/ConvNets)
cnn主要适合处理图片,比如给图片分类、给图片自动打标签、无人驾驶等。一般2D的cnn用来处理图片,3D的cnn用来处理视频。近来也有人开始用于nlp自然语言处理 (参考阅读) 。cnn卷积神经网络是对传统神经网络的改进,改进点包括:
1,提出卷积层convolutional layers layer和池化层max-pooling layer(subsampling layer),替代全连层fully connected layer。
2,将层之间的全连接改成非全连接,从而降低运算量,也降低过拟合的发生。
3,卷积层用的激活函数是ReLU或者tanh。
cnn的原理详细介绍参见 (colah's blog)
cnn架构图 ,
架构详细分析 ,cnn的层有三类:Convolutional Layer, Pooling Layer和Fully-Connected Layer。其典型架构为[INPUT - CONV - RELU - POOL - FC]。
如何理解卷积的概念,可以参照 (这儿) 。更详细更深入的解释卷积参照 Chris Olah’s post on the topic 。卷积可以用来作图片模糊处理、探测图片边缘。
也叫softmax layer,最后一层通常选用softmax激活函数。
cnn可以用于nlp自然语言处理,包括文本分类、情感分析、垃圾邮件监测、主题分类、关系抽取、信息抽取、信息推荐、等。cnn for nlp的原理参见 Understanding Convolutional Neural Networks for NLP 。
使用tensorflow实现一个文本分类cnn模型。具体参见 Implementing a CNN for Text Classification in TensorFlow 。
tensorflow实现cnn实例 (github源码)
cnn用于文本分类实例 (github源码)
sennchi
㈢ 卷积神经网络 有哪些改进的地方
卷积神经网络的研究的最新进展引发了人们完善立体匹配重建热情。从概念看,基于学习算法能够捕获全局的语义信息,比如基于高光和反射的先验条件,便于得到更加稳健的匹配。目前已经探求一些两视图立体匹配,用神经网络替换手工设计的相似性度量或正则化方法。这些方法展现出更好的结果,并且逐步超过立体匹配领域的传统方法。事实上,立体匹配任务完全适合使用CNN,因为图像对是已经过修正过的,因此立体匹配问题转化为水平方向上逐像素的视差估计。
与双目立体匹配不同的是,MVS的输入是任意数目的视图,这是深度学习方法需要解决的一个棘手的问题。而且只有很少的工作意识到该问题,比如SurfaceNet事先重建彩色体素立方体,将所有像素的颜色信息和相机参数构成一个3D代价体,所构成的3D代价体即为网络的输入。然而受限于3D代价体巨大的内存消耗,SurfaceNet网络的规模很难增大:SurfaceNet运用了一个启发式的“分而治之”的策略,对于大规模重建场景则需要花费很长的时间。
㈣ 吴恩达 卷积神经网络 CNN
应用计算机视觉时要面临的一个挑战是数据的输入可能会非常大。例如一张 1000x1000x3 的图片,神经网络输入层的维度将高达三百万,使得网络权重 W 非常庞大。这样会造成两个后果:
神经网络结构复杂,数据量相对较少,容易出现过拟合;
所需内存和计算量巨大。
因此,一般的神经网络很难处理蕴含着大量数据的图像。解决这一问题的方法就是使用卷积神经网络
我们之前提到过,神经网络由浅层到深层,分别可以检测出图片的边缘特征、局部特征(例如眼睛、鼻子等),到最后面的一层就可以根据前面检测的特征来识别整体面部轮廓。这些工作都是依托卷积神经网络来实现的。
卷积运算(Convolutional Operation)是卷积神经网络最基本的组成部分。我们以边缘检测为例,来解释卷积是怎样运算的。
图片最常做的边缘检测有两类:垂直边缘(Vertical Edges)检测和水平边缘(Horizontal Edges)检测。
比如检测一张6x6像素的灰度图片的vertical edge,设计一个3x3的矩阵(称之为filter或kernel),让原始图片和filter矩阵做卷积运算(convolution),得到一个4x4的图片。 具体的做法是,将filter矩阵贴到原始矩阵上(从左到右从上到下),依次可以贴出4x4种情况。 让原始矩阵与filter重合的部分做element wise的乘积运算再求和 ,所得的值作为4x4矩阵对应元素的值。如下图是第一个元素的计算方法,以此类推。
可以看到,卷积运算的求解过程是从左到右,由上到下,每次在原始图片矩阵中取与滤波器同等大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,将结果组成一个矩阵。
下图对应一个垂直边缘检测的例子:
如果将最右边的矩阵当作图像,那么中间一段亮一些的区域对应最左边的图像中间的垂直边缘。
下图3x3滤波器,通常称为垂直 索伯滤波器 (Sobel filter):
看看用它来处理知名的Lena照片会得到什么:
现在可以解释卷积操作的用处了:用输出图像中更亮的像素表示原始图像中存在的边缘。
你能看出为什么边缘检测图像可能比原始图像更有用吗?
回想一下MNIST手写数字分类问题。在MNIST上训练的CNN可以找到某个特定的数字。比如发现数字1,可以通过使用边缘检测发现图像上两个突出的垂直边缘。
通常,卷积有助于我们找到特定的局部图像特征(如边缘),用在后面的网络中。
假设输入图片的大小为 n×n,而滤波器的大小为 f×f,则卷积后的输出图片大小为 (n−f+1)×(n−f+1)。
这样就有两个问题:
为了解决这些问题,可以在进行卷积操作前,对原始图片在边界上进行填充(Padding),以增加矩阵的大小。通常将 0 作为填充值。
设每个方向扩展像素点数量为 p,则填充后原始图片的大小为 (n+2p)×(n+2p),滤波器大小保持 f×f不变,则输出图片大小为 (n+2p−f+1)×(n+2p−f+1)。
因此,在进行卷积运算时,我们有两种选择:
在计算机视觉领域,f通常为奇数。原因包括 Same 卷积中 p=(f−1)/ 2 能得到自然数结果,并且滤波器有一个便于表示其所在位置的中心点。
卷积过程中,有时需要通过填充来避免信息损失,有时也需要通过设置 步长(Stride) 来压缩一部分信息。
步长表示滤波器在原始图片的水平方向和垂直方向上每次移动的距离。之前,步长被默认为 1。而如果我们设置步长为 2,则卷积过程如下图所示:
设步长为 s,填充长度为p, 输入图片大小为n x n, 滤波器大小为f x f, 则卷积后图片的尺寸为:
注意公式中有一个向下取整的符号,用于处理商不为整数的情况。向下取整反映着当取原始矩阵的图示蓝框完全包括在图像内部时,才对它进行运算。
如果我们想要对三通道的 RGB 图片进行卷积运算,那么其对应的滤波器组也同样是三通道的。过程是将每个单通道(R,G,B)与对应的滤波器进行卷积运算求和,然后再将三个通道的和相加,将 27 个乘积的和作为输出图片的一个像素值。
如果想同时检测垂直和水平边缘,或者更多的边缘检测,可以增加更多的滤波器组。例如设置第一个滤波器组实现垂直边缘检测,第二个滤波器组实现水平边缘检测。设输入图片的尺寸为 n×n×nc(nc为通道数),滤波器尺寸为 f×f×nc,则卷积后的输出图片尺寸为 (n−f+1)×(n−f+1)×n′c,n′c为滤波器组的个数。
与之前的卷积过程相比较,卷积神经网络的单层结构多了激活函数和偏移量;而与标准神经网络相比,滤波器的数值对应着权重 W[l],卷积运算对应着 W[l]与 A[l−1]的乘积运算,所选的激活函数变为 ReLU。
对于一个 3x3x3 的滤波器,包括偏移量 b(27+1)在内共有 28 个参数。不论输入的图片有多大,用这一个滤波器来提取特征时,参数始终都是 28 个,固定不变。即选定滤波器组后,参数的数目与输入图片的尺寸无关。因此,卷积神经网络的参数相较于标准神经网络来说要少得多。这是 CNN 的优点之一。
图像中的相邻像素倾向于具有相似的值,因此通常卷积层相邻的输出像素也具有相似的值。这意味着,卷积层输出中包含的大部分信息都是冗余的。如果我们使用边缘检测滤波器并在某个位置找到强边缘,那么我们也可能会在距离这个像素1个偏移的位置找到相对较强的边缘。但是它们都一样是边缘,我们并没有找到任何新东西。池化层解决了这个问题。这个网络层所做的就是通过减小输入的大小降低输出值的数量。池化一般通过简单的最大值、最小值或平均值操作完成。以下是池大小为2的最大池层的示例:
在计算神经网络的层数时,通常只统计具有权重和参数的层,因此池化层通常和之前的卷积层共同计为一层。
图中的 FC3 和 FC4 为全连接层,与标准的神经网络结构一致。
个人推荐 一个直观感受卷积神经网络的网站 。
相比标准神经网络,对于大量的输入数据,卷积过程有效地减少了 CNN 的参数数量,原因有以下两点:
-参数共享(Parameter sharing):特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。即在卷积过程中,不管输入有多大,一个特征探测器(滤波器)就能对整个输入的某一特征进行探测。
-稀疏连接(Sparsity of connections):在每一层中,由于滤波器的尺寸限制,输入和输出之间的连接是稀疏的,每个输出值只取决于输入在局部的一小部分值。
池化过程则在卷积后很好地聚合了特征,通过降维来减少运算量。
由于 CNN 参数数量较小,所需的训练样本就相对较少,因此在一定程度上不容易发生过拟合现象。并且 CNN 比较擅长捕捉区域位置偏移。即进行物体检测时,不太受物体在图片中位置的影响,增加检测的准确性和系统的健壮性。
在神经网络可以收敛的前提下,随着网络深度增加,网络的表现先是逐渐增加至饱和,然后迅速下降
需要注意,网络退化问题不是过拟合导致的,即便在模型训练过程中,同样的训练轮次下,退化的网络也比稍浅层的网络的训练错误更高,如下图所示。
这一点并不符合常理:如果存在某个 K层网络是当前F的最优的网络,我们构造更深的网络。那么K之后的层数可以拟合成恒等映射,就可以取得和F一直的结果。如果K不是最佳层数,那么我们比K深,可以训练出的一定会不差于K的。总而言之,与浅层网络相比,更深的网络的表现不应该更差。因此,一个合理的猜测就是, 对神经网络来说,恒等映射并不容易拟合。
也许我们可以对网络单元进行一定的改造,来改善退化问题?这也就引出了残差网络的基本思路
既然神经网络不容易拟合一个恒等映射,那么一种思路就是构造天然的恒等映射。
实验表明,残差网络 很好地解决了深度神经网络的退化问题 ,并在ImageNet和CIFAR-10等图像任务上取得了非常好的结果,同等层数的前提下残差网络也 收敛得更快 。这使得前馈神经网络可以采用更深的设计。除此之外, 去除个别神经网络层,残差网络的表现不会受到显着影响 ,这与传统的前馈神经网络大相径庭。
2018年的一篇论文,The Shattered Gradients Problem: If resnets are the answer, then what is the question,指出了一个新的观点,尽管残差网络提出是为了解决梯度弥散和网络退化的问题, 它解决的实际上是梯度破碎问题
作者通过可视化的小型实验(构建和训练一个神经网络发现,在浅层神经网络中,梯度呈现为棕色噪声(brown noise),深层神经网络的梯度呈现为白噪声。在标准前馈神经网络中,随着深度增加, 神经元梯度的相关性(corelation)按指数级减少 (1 / 2^L) ;同时, 梯度的空间结构也随着深度增加被逐渐消除 。这也就是梯度破碎现象。
梯度破碎为什么是一个问题呢?这是因为许多优化方法假设梯度在相邻点上是相似的,破碎的梯度会大大减小这类优化方法的有效性。另外,如果梯度表现得像白噪声,那么某个神经元对网络输出的影响将会很不稳定。
相较标准前馈网络, 残差网络中梯度相关性减少的速度从指数级下降到亚线性级 ) (1 / sqrt(L)) ,深度残差网络中,神经元梯度介于棕色噪声与白噪声之间(参见上图中的c,d,e);残差连接可以 极大地保留梯度的空间结构 。残差结构缓解了梯度破碎问题。
1x1 卷积指滤波器的尺寸为 1。当通道数为 1 时,1x1 卷积意味着卷积操作等同于乘积操作。
而当通道数更多时,1x1 卷积的作用实际上类似全连接层的神经网络结构,从而降低(或升高,取决于滤波器组数)数据的维度。
池化能压缩数据的高度(nH)及宽度(nW),而 1×1 卷积能压缩数据的通道数(nC)。在如下图所示的例子中,用 filters个大小为 1×1×32 的滤波器进行卷积,就能使原先数据包含的 32个通道压缩为 filters 个。
在这之前,网络大都是这样子的:
也就是卷积层和池化层的顺序连接。这样的话,要想提高精度,增加网络深度和宽度是一个有效途径,但也面临着参数量过多、过拟合等问题。(当然,改改超参数也可以提高性能)
有没有可能在同一层就可以提取不同(稀疏或不稀疏)的特征呢(使用不同尺寸的卷积核)?于是,2014年,在其他人都还在一味的增加网络深度时(比如vgg),GoogleNet就率先提出了卷积核的并行合并(也称Bottleneck Layer),如下图。
和卷积层、池化层顺序连接的结构(如VGG网络)相比,这样的结构主要有以下改进:
按照这样的结构来增加网络的深度,虽然可以提升性能,但是还面临计算量大(参数多)的问题。为改善这种现象,GooLeNet借鉴Network-in-Network的思想,使用1x1的卷积核实现降维操作(也间接增加了网络的深度),以此来减小网络的参数量(这里就不对两种结构的参数量进行定量比较了),如图所示。
最后实现的inception v1网络是上图结构的顺序连接
由于卷积这门课的其他内容和计算机视觉关系比较密切。对我理解推荐系统帮助不大。所以这个系列就到这里。吴恩达的课还是很好的,作业和课和测验我都认真做啦。
㈤ 吴教授的CNN课堂:进阶 | 从LeNet到残差网络(ResNet)和Inception Net
第二周是关于卷积网络(CNN)进阶部分,学到挺多新东西。因为之前了解过CNN基础后,就大多在用RNN进行自然语言处理方面的研究,很多CNN的最新进展虽有耳闻,但是并不清楚。
特别是各个论文模型又喜欢取一些奇怪的名字(比如昨天读的两篇论文,一个叫NTT,一个叫TMD),如果没读过论文,不了解一些缘由,真是傻傻分不清。
之前看视觉问答时,预处理图片部分需选择训练好的网络,结果一看,一大堆什么 VGG、Res、Incept 这些看不懂的名词,而且后面还加着16、19、101等数字和V1、V2、V3这样的版本数。结果只能两眼一抹黑,参考别人的论文,瞎选了一个。
闲话不多说,开始吧。
在提到之后的ResNet和Inception Net前,最好先回顾一下CNN里面成功架构的发展,这样就可以把握住一条清晰的发展脉络,之后讲解进阶网络的时候也能很快理解。
首先是爷爷级的 LeNet-5 ,因为这大概是20年前提出来的了。是当时尚且青涩,而现在已是深度学习四大天王里的LeCun提出的,LeNet也是取自他名字前半截,5表示只有五层,当时用于处理MNIST这样的手写数字识别。
在基础课里面吴教授也有亲手把整个架构画出来,所以并不是很复杂。分别卷积和池化两次后,然后直接输入全连接网络就可以了。
LeNet后,因为人工智能寒冬,所以很长时间并没有太大发展。
直到13年的时候,后起之秀Alex Krizhevsky (相信不少人也看过他的博客,听过他有名的Stanford cs231) 提出了AlexNet,在ImageNet比赛上取得了很大的成功,向大家展示了深度学习的力量,从此掀起一次浪潮。
AlexNet和LeNet差别并不是很大,主要不同有以下三点。
在AlexNet展示了深度学习在图像处理上的成功后,大家也就开始不断在其之上完善图像处理的CNN构架。而VGG就是第一个 非常简洁又系统化,提出了一套怎么使用更深的网络来训练的网络架构 。
VGG的创举之点在于,比起之前那些网络其中参数的混杂,它很有计划和条理地布置了架构中各个层的结构。比如说可以列举出一下几点:
VGG是当时参赛组(Visual Geometry Group)的名称。一般现在大家用到的都是VGG-16或者VGG-19,16和19也正如所想,分别是对应的VGG版本中的层数。
看上去16和19层好像也很多了,但和之后ResNet这样的动不动就101,152层的巨无霸相比,还是小巫见大巫。
那为什么不也增加VGG的层数呢?
这里要提到深层神经网络训练中的一个大问题了,那就是当层数过大时,会产生所谓的 梯度爆炸(Exploding Gradients)和梯度消失(Vanishing Gradients) 现象。
打个比方,如果每次的梯度相乘的系数都是小于1的数,假如说0.6, 那么19 层算下来,0.6的19次方就已经是0.00061了,更别提上百层了。这样传播到最底层的时候,能够 学习到的参数就很小 了,这就是梯度消失。
反过来,梯度爆炸的情况,如果系数大于1,多次累乘后就会得到一个很大的数,也会造成不好的结果。有点像是复利的概念,也就是那个和国王打赌要一棋盘稻子的故事。
梯度爆炸还好解决,可以用 梯度修剪(Gradient Clipping) 修剪一下就好了。而梯度消失就有点难解决了。
因为这样的问题,所以虽然理论上普通的深处网络是越深学的越好,但是实际上却事与愿违。下图横轴是网络层数,竖轴是训练误差(越小越好)。 理论上随着层数增加,误差就减小,但是实际是过了某个点之后,误差反而会增大。
那么ResNet是怎么训练到上百层的呢,难道它就不怕上面的问题吗?
它用一个很简单的方法解决了上面的问题。
有很多很棒的论文,没读之前,看名字觉得很厉害的。但结果一看论文,才发现方法非常之简洁,特别是有一些利用数学知识推导出的简单解决方法,让人不得不一边拍手称赞,一边感叹自己数学渣。
ResNet也是这样子的,看名字很酷炫,但是打开论文一看,才发现原来是这样啊。
ResNet的最主要就是 Shortcut(捷径) 这个概念。来看看这到底是什么吧,首先假设我们从一个神经网络中取出两层,当做是一个块(block),先不管中间是MLP或者是CNN。
而shortcut就如下图一样,从第一层的输入直接建立一条捷径到第二层的输出,激活函数前。
也就是说第二层激活后的输出可以会发生这样的变化。
由
变成
这样子处理之后,我们得到的这一小块就叫做 Resial Block(残差块) ,而把这些块堆叠起来就是我们的残差网络了。很简单吧,像下面这样,一个34层的残差网络。
这样子我们就得到残差网络,那么实际上训练会怎么样呢。
正是我们想要的模型,也非常符合理论。
最后再提一下残差网络背后的原理,为什么这样简单改一下就能够有这么好的表现呢。
原因是捷径的建立,使得每一个残差块可以 很容易地学习到恒等函数 ,也就是f(x)=x。也就是说加入残差块之后,再差也能学会恒等函数,保留信息,把之前的结果直接这样传下去,所以也就不用担心之前提到的 梯度消失 问题了。
介绍Inception网络前,先介绍一下其中一个很重要的概念1x1卷积。
初看1x1卷积的概念会觉得很奇怪,这样子每次对一个像素进行卷积有什么用,我们本来不就是想检测局部的特征吗。但是如果理解了 通道 概念的话,就能很好理解了。
因为,如果说普通的 大窗口卷积更注重一个通道内各个特征的互动 的话,那么1x1卷积就是只在通道与通道进行卷积运算,加强了通道之间的互动。
这就是第一点, 加强了通道与通道之间的交流 。用这个就可以只对通道进行一些操作,如用1x1卷积增加通道数,减少通道数,也可以不增不减,但是对之前的通道进行整理。
1x1卷积网络还有一个好处,那就是 通过合理运用可以减少整体网络的运算量 。
还是来举例子吧,假设有以下一个卷积过程。
那么上面这个过程所需要的运算量大约一亿两千万次。
而如果我们巧妙地利用1x1卷积来对通道进行合理处理的话,像下面这样。
运算量会变得只有大概一千二百万左右,一下子就缩小了十倍。
有了上面的知识以后,一切就简单多了。Inception网络的核心概念是,既然在选择CNN架构的时候要为了过滤器的窗口大小考虑半天,那么 何不把各个尺寸都用上去,最后再把结果接起来就好了呢 。
于是就有了下面这样的 Inception模块 。有用1x1、3x3、5x5各个尺寸的卷积,而且还用到之前讲到的利用1x1卷积减少运算量的技巧。
最后至于整个Inception网络,就像之前残差网络一样,把 Inception模块 堆叠起来就好了。
当然论文中还有一些次要细节,这里就不多说了。
而且自最初的论文之后,Inception网络也有很多改进,加入了很多技巧,比如之前的残差网络中的技巧。所以现在网上的Inception网络,后面会有V1、V2、V3之类后缀,表示的就是各个版本。
最后,作为余谈,说说为什么Inception网络要叫做 Inception 网络。
因为在这篇正经的学术论文里面,作者引用了一个链接,点开后会出现这张图片。
㈥ 卷积神经网络(CNN)基础
在七月初七情人节,牛郎织女相见的一天,我终于学习了CNN(来自CS231n),感觉感触良多,所以赶快记下来,别忘了,最后祝大家情人节快乐5555555.正题开始!
CNN一共有卷积层(CONV)、ReLU层(ReLU)、池化层(Pooling)、全连接层(FC(Full Connection))下面是各个层的详细解释。
卷积,尤其是图像的卷积,需要一个滤波器,用滤波器对整个图像进行遍历,我们假设有一个32*32*3的原始图像A,滤波器的尺寸为5*5*3,用w表示,滤波器中的数据就是CNN的参数的一部分,那么在使用滤波器w对A进行滤波的话,可以用下面的式子表示:
其中x为原始图像的5*5*3的一部分,b是偏置项置为1。在对A进行滤波之后,产生的是一个28*28*1的数据。那么假设我们存在6个滤波器,这六个滤波器之间彼此是独立的,也就是他们内部的数据是不同的且没有相关性的。可以理解为一个滤波器查找整幅图像的垂直边缘,一个查找水平边缘,一个查找红色,一个查找黑色这样。那么我就可以产生6个28*28*1的数据,将它们组合到一起就可以产生28*28*6的数据,这就是卷积层主要做的工作。
CNN可以看作一系列的卷积层和ReLU层对原始数据结构进行处理的神经网络,处理的过程可以用下面这幅图表示
特别要注意的是滤波器的深度一定要与上一层传来的数据的深度相同,就像上图的第二个卷积层在处理传来的28*28*6的数据时要使用5*5*6的滤波器.
滤波器在图像上不断移动对图像滤波,自然存在步长的问题,在上面我们举的例子都是步长为1的情况,如果步长为3的话,32*32*3的图像经过5*5*3的滤波器卷积得到的大小是(32-5)/3+1=10, 注:步长不能为2因为(32-5)/2+1=14.5是小数。
所以当图像大小是N,滤波器尺寸为F时,步长S,那么卷积后大小为(N-F)/S+1
我们从上面的图中可以看到图像的长和宽在逐渐的减小,在经过超过5层之后极可能只剩下1*1的空间尺度,这样是十分不好的,而且也不利于我们接下来的计算,所以我们想让卷积层处理完之后图像在空间尺度上大小不变,所以我们引入了pad the border的操作。pad其实就是在图像周围补0,扩大图像的尺寸,使得卷积后图像大小不变。在CNN中,主要存在4个超参数,滤波器个数K,滤波器大小F,pad大小P和步长S,其中P是整数,当P=1时,对原始数据的操作如图所示:
那么在pad操作后卷积后的图像大小为:(N-F+2*P)/S+1
而要想让卷积层处理后图像空间尺度不变,P的值可以设为P=(F-1)/2
卷积层输入W 1 *H 1 *D 1 大小的数据,输出W 2 *H 2 *D 2 的数据,此时的卷积层共有4个超参数:
K:滤波器个数
P:pad属性值
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F+2P)/S+1
H 2 =(H 1 -F+2P)/S+1
D 2 =D 1
1*1的滤波器也是有意义的,它在深度方向做卷积,例如1*1*64的滤波器对56*56*64的数据卷积得到56*56的数据
F通常是奇数,这样可以综合考虑上下左右四个方向的数据。
卷积层从神经元的角度看待可以有两个性质: 参数共享和局域连接 。对待一个滤波器,例如5*5*3的一个滤波器,对32*32*3的数据卷积得到28*28的数据,可以看作存在28*28个神经元,每个对原图像5*5*3的区域进行计算,这28*28个神经元由于使用同一个滤波器,所以参数相同,我们称这一特性为 参数共享 。
针对不同的滤波器,我们可以看到他们会看到同一区域的图像,相当于在深度方向存在多个神经元,他们看着相同区域叫做 局域连接
参数共享减少了参数的数量,防止了过拟合
局域连接为查找不同特征更丰富的表现图像提供了可能。
卷积就像是对原图像的另一种表达。
激活函数,对于每一个维度经过ReLU函数输出即可。不改变数据的空间尺度。
通过pad操作,输出图像在控件上并没有变化,但是深度发生了变化,越来越庞大的数据给计算带来了困难,也出现了冗余的特征,所以需要进行池化操作,池化不改变深度,只改变长宽,主要有最大值和均值两种方法,一般的池化滤波器大小F为2步长为2,对于最大值池化可以用下面的图像清晰的表示:
卷积层输入W 1 *H 1 *D 1 大小的数据,输出W 2 *H 2 *D 2 的数据,此时的卷积层共有2个超参数:
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F)/S+1
H 2 =(H 1 -F)/S+1
D 2 =D 1
将最后一层(CONV、ReLU或Pool)处理后的数据输入全连接层,对于W 2 *H 2 *D 2 数据,我们将其展成1*1*W 2 *H 2 *D 2 大小的数据,输入层共有W 2 *H 2 *D 2 个神经元,最后根据问题确定输出层的规模,输出层可以用softmax表示。也就是说,全连接层就是一个常见的BP神经网络。而这个网络也是参数最多的部分,是接下来想要去掉的部分。完整的神经网络可以用下面的图表示:
[(CONV-ReLU)*N-POOL?]*M-(FC-RELU)*K,SoftMax
1.更小的滤波器与更深的网络
2.只有CONV层而去掉池化与全链接
最早的CNN,用于识别邮编,结构为:
CONV-POOL-CONV-POOL-CONV-FC
滤波器大小5*5,步长为1,池化层2*2,步长为2
2012年由于GPU技术所限,原始AlexNet为两个GPU分开计算,这里介绍合起来的结构。
输入图像为227*227*3
1.首次使用ReLU
2.使用Norm layers,现在已经抛弃,因为效果不大
3.数据经过预处理(例如大小变化,颜色变化等)
4.失活比率0.5
5.batch size 128
6.SGD Momentum 参数0.9(SGD和Momentum见我的其他文章)
7.学习速率 0.01,准确率不在提升时减少10倍,1-2次后达到收敛
8.L2权重减少0.0005
9.错误率15.4%
改进自AlexNet,主要改变:
1.CONV1的滤波器从11*11步长S=4改为7*7步长为2.
2.CONV3,4,5滤波器数量有384,384,256改为512,1024,512(滤波器数量为2的n次幂有利于计算机计算可以提高效率)
错误率:14.8%后继续改进至11.2%
当前最好的最易用的CNN网络,所有卷积层滤波器的大小均为3*3,步长为1,pad=1,池化层为2*2的最大值池化,S=2。
主要参数来自全连接层,这也是想要去掉FC的原因。
具有高度的统一性和线性的组合,易于理解,十分方便有VGG-16,VGG-19等多种结构。
错误率7.3%
完全移除FC层,参数只有500万,使用Inception模块(不太理解,有时间继续看)
准确率6.67%
准确率3.6%
拥有极深的网络结构,且越深准确率越高。是传统CNN不具备的特点,传统CNN并非越深越准确。需要训练时间较长但是快于VGG
1.每个卷积层使用Batch Normalization
2.Xavier/2初始化
3.SGD+Momentum(0.9)
4.Learning rate:0.1,准确率不变减小10倍(因为Batch Normalization所以比AlexNet大)
5.mini-batch size 256
6.Weight decay of 0.00001
7.不适用失活(因为Batch Normalization)
具体的梯度过程学完ResNet再说吧。