甲乙小朋友的房子

甲乙小朋友很笨,但甲乙小朋友不会放弃

0%

深度学习算法-几种常见的卷积网络

我们先回顾一些经典的卷积网络,然后看看当下比较流行的几种网络

经典的卷积网络

介绍几种经典的卷积神经网络结构,分别是LeNet、AlexNet、VGGNet

LeNet-5

LeNet-5主要是针对灰度设计的,所以输入较小,为\(32\times 32 \times 1\),其结构如下:

在LetNet中,存在的经典模式:

  • 随着网络的深度增加,图像的大小在缩小,与此同时,通道的数量却在增加;
  • 每个卷积层后面接一个池化层。

LeNet-5是1998年写的,大约有6万个参数,基本的网络结构跟今天差不多,只是有几点不同:

激活函数用sigmoid或tanh,没有用relu;当时比较流行使用平均池化;池化后使用了sigmoid激活函数;没有使用pdding;

当时的每个卷积核是跟原图像的通道数是一样的,是因为当时计算能力弱,为了减少计算量用了很复杂的运算进行,现在一般都不这么用了;

AlexNext

AlextNet和LeNet类似,但是网络大了很多,参数大约有6000万个;相比于LeNet-5它使用了relu激活函数;当时的GPU运行还比较慢,用了多GPU的方式训练。

从这篇论文开始,计算机视觉研究者开始关注深度学习,并相信深度学习可以应用于计算机视觉领域,此后,深度学习在计算机视觉及其它领域的影响力与日俱增。

AlexNet直接对彩色的大图片进行处理,其结构如下:

VGG-16

VGG-16总共包含约1.38亿个参数,但是它的结构并不复杂,很整齐,卷积核大小和池化参数恒定,几个卷积后面跟着一个池化,卷积核的数量以加倍的方式变化,每次池化后图片高度宽度减半,这种相对一致的网络结构对研究者很有吸引力。而主要缺点在于需要训练的参数特点多。VGG-19比VGG-16更大,只是它们的效果差不多,所以很多人还是用VGG-16。

如果想研读论文的话,ng的建议顺序是AlexNet(比较好懂),VGG,LeNet-5(比较晦涩)。

残差网络 (ResNets)

Residual Networks

因为存在梯度消失和梯度爆炸的问题,深度很深的网络是很难训练的。我们可以通过跳过连接( skip connections ) ,来构建能训练深度网络的ResNets。

先回顾一下正常网络的前向传播计算步骤:

  • Linear:\(z^{[l+1]} = W^{[l+1]}a^{[l]} + b^{[l+1]}\)
  • Relu:\(a^{[l+1]} = g(z^{[l+1]})\)
  • Linear:\(z^{[l+2]} = W^{[l+2]}a^{[l+1]} + b^{[l+2]}\)
  • Relu:\(a^{[l+2]} = g(z^{[l+2]})\)

残差网络是由残差块构成的。正常的网络按照一个主路径传递,如果我们在某层的输出后跳过了一层(或者好几层),直接达到后层的激活函数之前(例如下图的从\(a^{[l]}到z^{[l+2]}\) 的连接),这条路就是捷径(称之为short cut 或 skip connection),含有捷径的这一块(包含主路径)就叫残差块。

也就是前向传播公式的最后一个步骤变为:\(a^{[l+2]} = g(z^{[l+2]}+a^{[l]})\)

那么残差块的网络结构就是:

所谓构建残差网络(ResNets)就是通过很多这样的残差块堆积在一起,形成一个深度神经网络。其结构如下:

如下图所示,在普通网络(plain network)中,理论上随着深度的加深,错误率不断下降。然而实际上因为太深的原因难以训练,到了后面训练错误率会上升。

在残差网络中,随着深度的不断增加,错误率不断下降。

ResNet对于中间的激活函数来说,有助于能够达到更深的网络,解决梯度消失和梯度爆炸的问题。

为什么残差会有用呢?看个例子。假设有个比较大的神经网络,输入为\(x\),输出为\(a^{[l]}\)。如果我们想增加网络的深度,这里再给网络增加一个残差块:

假定使用relu激活函数,现在\(a^{[l]}\)跳过了\(a^{[l+1]}\)层,那么有

\[a^{[l+2]} = g(z^{[l+2]}+a^{[l]})=g(W^{[l+2]}a^{[l+1]}+b^{[l+2]}+a^{[l]})\]

如果我们做了2正则化或者权重衰减,会压缩W和b的值,那么假设\(W^{[l+2]}=0\)\(b^{[l+2]}=0\),那么上式子就变为:

\[a^{[l+2]} = g(z^{[l+2]}+a^{[l]})=g(a^{[l]})=relu(a^{[l]})= a^{[l]}\]

因为使用的是relu,而且a[l]是已经被激活过的,结果表明残差块学习这个恒等式函数并不难,即使中间隔着两层我们还是能得到a[l+2] = a[l]。

值得注意的是这里\(a^{[l+2]} =g(z^{[l+2]}+a^{[l]})\) , 想相加那就必须维度一致。所以残差网络中使用了很多相同的卷积来保留维度。如果维度不一致的话,z[i+2] + a[l]的时候,在a[l]前面乘上一个权重,来保持维度一致,这个维度是网络自己学习得到的参数,它用0填充a[l]或者其它手段使得维度一致。

Inception Net

\(1 \times 1\) 卷积

在二维上,\(1\times 1\) 卷积就相当于每个元素与一个数字相乘。如下图所示:

但假如是多通道的三维上,如果一个三维的东西与一个\(1\times1\times n_C\) 的东西相乘,如下图所示,就相当于三维图形上的\(1\times1\times n_C\) 切片,也就是\(n_c\) 个点乘以权重,通过Relu函数后,输出对应的结果。而不同的卷积核则相当于不同的隐层神经元结点与切片上的点进行一一连接。

最终三维的图形应用1×1的卷积核得到一个相同长宽但第三维度变为卷积核个数的图片。

所以根本上1×1卷积核相当于对一个切片上的\(n_c\)个单元都应用了一个全连接的神经网络。

1x1卷积应用:

  • 维度压缩:使用目标维度的1×1的卷积核个数。
  • 增加非线性:保持与原维度相同的1×1的卷积核个数。

Inception Network

Inception Network 的作用就是使我们无需去考虑在构建深度卷积神经网络时,使用多大的卷积核以及是否添加池化层等问题。

用机器代替人工来确定卷积层中的卷积核类型,或者确定是否需要创建卷积层或池化层。

对于一个输入的图像,是用11,还是33,还是5*5的卷积,还是做一种特殊的池化,Inception会把他们都计算出来叠在一起,由网络自己学习应该采用什么运算。

在上面的Inception结构中,应用了不同的卷积核,以及带padding的池化层。在保持输入图片大小不变的情况下,通过不同运算结果的叠加,增加了通道的数量。

计算成本问题

对于上面的5×5大小卷积核的计算成本:

  • 1 filters:5×5×192;
  • 32 个 filters;
  • 总的计算成本:28×28×32×5×5×192=120M

现在考虑先用11的卷积,构造一个瓶颈层,用作过渡的计算成本,也将下面的中间的层叫做“bottleneck layer”:

  • 1×1卷积层计算成本:28×28×16×1×1×192=2.4M
  • 5×5卷积层计算成本:28×28×32×5×5×16=10.0M
  • 总的计算成本:2.4M+10.0M=12.4M

这样需要计算的乘法运算次数约等于1200千万次,比之前缩小了10倍,如上图所示。

事实证明,只要合理地设置“bottleneck layer”,既可以显著减小上层的规模,同时又能降低计算成本,从而不会影响网络的性能。

结合

利用1*1卷积可以减小计算量,把这个和上面说的Inception结合起来,可以得到下图所示模块。

img

这些一个个Inception模块堆叠起来,就是一个大的Inception网络,如下图所示。可以注意到除了最后的输出外,还有几个分支输出,这些分支输出是根据中间隐藏层进行预测的输出,它确保了中间隐藏层也参与了特征计算,它们也能预测图片的分类,它起到一种调整的作用,并且能防止网络过拟合。

迁移学习

小数据集:

如今在深度学习领域,许多研究者都会将他们的工作共享到网络上。在我们实施自己的工作的时候,比如说做某种物体的识别分类,但是只有少量的数据集,对于从头开始训练一个深度网络结构是远远不够的。

但是我们可以应用迁移学习,应用其他研究者建立的模型和参数,用少量的数据仅训练最后自定义的softmax网络。从而能够在小数据集上达到很好的效果。

大数据集:

如果我们在自己的问题上也拥有大量的数据集,我们可以多训练后面的几层。总之随着数据集的增加,我们需要“ freeze”的层数越来越少。最后如果我们有十分庞大的数据集,那么我们可以训练网络模型的所有参数,将其他研究者训练的模型参数作为参数的初始化来替代随机初始化,来加速我们模型的训练。

数据扩充

与其他机器学习问题相比,在计算机视觉领域当下最主要的问题是没有办法得到充足的数据。所以在我们训练计算机数据模型的时候,数据的扩充就是会非常有用。

数据扩充的方法:

  • 镜像翻转(Mirroring);
  • 随机剪裁(Random Cropping);
  • 色彩转换(Color shifting): 为图片的RGB三个色彩通道进行增减值,如(R:+20,G:-20,B:+20);PCA颜色增强:对图片的主色的变化较大,图片的次色变化较小,使总体的颜色保持一致。

训练过程中的数据扩充:

为了节省时间,数据扩充的过程和训练过程可以多CPU多线程来并行的实现。

计算机视觉现状

数据和手工工程:

不同问题当前的数据集大小:

在有大量数据的时候,我们更倾向于使用简单的算法和更少的手工工程。因为此时有大量的数据,我们不需要为这个问题来精心设计特征,我们使用一个大的网络结果或者更简单的模型就能够解决。

相反,在有少量数据的时候,我们从事更多的是手工工程。因为数据量太少,较大的网络结构或者模型很难从这些少量的数据中获取足够的特征,而手工工程实际上是获得良好表现的最佳方式。

对于机器学习应用:

  • 标记数据,(x,y);
  • 手工特征工程/网络结构/其他构建。

Tips for doing well:

在基准研究和比赛中,下面的tips可能会有较好的表现:

  • Ensembling:独立地训练多个网络模型,输出平均结果或加权平均结果;
  • 测试时的 Multi-crop:在测试图片的多种版本上运行分类器,输出平均结果。