深度卷积网络实例分析

为什么要进行实例分析

如何组合卷积层、池化层和全连接层形成一个卷积网络,许多人在一开始接触卷积网络是没有任何头绪。想要找到感觉,应该学习和分析已经设计好的卷积网络。

经典的卷积网络有

  • LeNet,
  • AlexNet,
  • VGG。

还有ResNet(残差网络),有152层。还有Inception。这些已经设计好的卷积网络会提供你设计卷积网络的技巧和灵感。

经典网络

LeNet

LeNet-5的卷积网络是
深度卷积网络实例分析
输入的图像是32×32×1,LeNet处理灰度图像。LeNet具体的超参数在图中标记出来了。LeNet有2个卷积层,2个池化层和2个全连接层。LeNet的参数大概有6万个参数。LeNet在上个实际80年代已经提出来了,作者当时使用的**函数是Sigmoid函数和tanh函数。

AlexNet

AlexNet的卷积网络是
深度卷积网络实例分析
输入图像是227×227×3。AlexNet使用Padding进行卷积,使用池化来减少图像的宽和高。最后使用softmax识别1000个类别。AlexNet大概有6000万个参数。AlexNet使用的**函数是ReLU。

VGG-16

VGG卷积使用3×3大小的过滤器,步长为1,使用Padding。池化使用最大池化,过滤器大小是2×2,步长是2,把图像长宽缩小一半。
VGG-16的卷积网络是
深度卷积网络实例分析
VGG-16的卷积使用的过滤器个数呈2的指数增长,比如64、128、256、512。VGG-16的池化层起减少图片大小的作用。VGG-16的16是指卷积层和全连接层一共有16个。VGG-16大约有1.38亿个参数。

残差网络(Residual Networks)

因为梯度爆炸和梯度消失,非常非常深的神经网络是很难训练的。跳远连接可以从某一网络层获取**值,然后迅速反馈给另外一层,甚至是更深的网络层。利用跳远连接构建能够训练深度网络的ResNet,深度能够达到100层以上。

ResNet是由残差块构建的,下图是一个残差块
深度卷积网络实例分析
这里有两个网络层,linearReLulinearReLu。经过的计算是

z[l+1]=W[l+1]a[l]+b[l+1]a[l+1]=g(z[l+1])z[l+2]=W[l+2]a[l+1]+b[l+2]a[l+2]=g(z[l+2])

a[l]加到l+2层,与z[l+2]一起进入**函数,a[l+2]=g(z[l+2]+a[l]),这就是跳远连接。

残差网络的结构是这样的
深度卷积网络实例分析
残差网络中加入了许多残差块。

随着网络层数的增加,普通神经网络的训练误差会先降低,然后会缓慢提高,而残差网络能够保证训练误差是递减的,如下图所示
深度卷积网络实例分析

为什么残差网络会有用呢?我们看看这条式子:a[l+2]=g(z[l+2]+a[l]),把z[l+2]展开得到a[l+2]=g(W[l+2]a[l+1]+b[l+2]+a[l]),对于加了正则化的神经网络,或者很深的网络层,W[l+2]的值都很小,假设W[l+2]b[l+2]的值都约等于0,那么a[l+2]=g(W[l+2]a[l+1]+b[l+2]+a[l])g(0+a[l])=a[l]。这个残差块相当于计算一个恒等式,残差块学习这个恒等式函数并不难。a[l+2]=a[l],说明即使给神经网络增加这两层,它的效率也并不逊色于更简单的神经网络。如果网络层l+1或者l+2学到了一些有用的信息,那么残差网络的效率就更高了。对于普通的神经网络,随着网络层数增加,就算是选择用来学习恒等函数的参数都很难,所以很多层最后的表现不但没有更好,反而更差。

要注意一点,a[l+2]a[l]的维度要相等,不然公式a[l+2]=g(z[l+2]+a[l])没法成立。所以ResNet的许多网络层的维度都相同。如果a[l+2]a[l]的维度不相同,可以添加一个参数Wsa[l+2]=g(z[l+2]+Wsa[l]),使得a[l+2]a[l]的维度相同。

最后看看在卷积网络中使用跳远连接的例子
深度卷积网络实例分析

网络中的网络和1×1卷积

1×1卷积有其特殊的用法。
深度卷积网络实例分析
进过1×1卷积,图像的宽和高没有减少。在原图中取出一块1×1×nc[l]区域,在与1个1×1过滤器卷积得到一个值,和多个1×1过滤器卷积得到多个值,这相当于一个全连接网络,所以1×1卷积又称作网络中的网络。

1×1卷积可以用来减少图片中的信道数。
深度卷积网络实例分析
原图的信道数有192个,太多了,对图像进行1×1卷积,使用32个1×1过滤器,能够得到信道数为32个的图像。

Inception

Inception可以帮助你决定使用多大的过滤器构建卷积层。Inception示意图如下
深度卷积网络实例分析
Inception会进行1×1卷积,3×3卷积,5×5卷积和MAX-POOL,把结果叠加起来构成输入。这是Inception的思想,把各种类型的卷积结果叠加起来,而不用关心哪些卷积操作有用,哪些卷积操作没用。

这样做的问题是会大大提高计算量。就拿5×5卷积来说。
深度卷积网络实例分析
输出图像是25×28×32,需要进行25×28×32次卷积操作,32个过滤器,过滤器大小为5×5,一共需要进行25×28×32×5×5×32次乘法运算,大约是1.2亿次。这是非常庞大的运算量。

Inception提出了一种可以缩减计算量的方法。
深度卷积网络实例分析
先进行1×1卷积,缩小图像的信道数,接着再进行5×5卷积。中间一层称为瓶颈层。1×1卷积需要进行28×28×16×192约等于240万次乘法运算,5×5卷积需要进行28×28×32×5×5×16约等于1000万次乘法运算,加起来一共需要大约1240万次乘法运算,是1.2亿的十分之一。

结合上述说的两个方面,Inception的组件为
深度卷积网络实例分析
使用这个组件可以组合出复杂的网络。
深度卷积网络实例分析
上图是来自某篇论文,红色部分指出了使用了Inception的组件。这篇论文指出,全连接不仅可以处于末端,从网络中间引出一些分支连接全连接,一样可以进行图片分类,而且效果还不差。这个特殊的网络是有Google公司的作者设计的,称为GoogleNet。

卷积网络的迁移学习

目前有许多卷积网络的开源实现代码,通过github等平台下载下来,供自己来使用。因为卷积网络的结构复杂,参数很多,自己实现和训练网络需要很长的时间。为了节省时间,可以使用别人已经训练好的神经网络,修改最后的输出层,就可以实现自己的卷积网络分类器了。

下图是卷积网络迁移学习例子
深度卷积网络实例分析
使用别人已经设计好的神经网络和训练好的参数,修改最后的softmax层。原来的softmax有1000个输出值,而我们的目标有3个输出值,所以修改softmax层。使用训练集来训练这个修改后的卷积网络。

如果训练集数据较少,可以把卷积网络的卷积层看做一个整体,训练时冻结这个整体,即不要改变卷积层已经训练好的参数,训练时只训练softmax层的参数。训练时可以先把最后一层卷积层的输出值计算好,训练时从最后一层卷积层开始训练,可以加快训练时间。如果训练集数据增加了一些,可以只冻结前面几层卷积层,剩下的网络层的参数需要训练。训练集数据越多,可以冻结越少的网络层。当然,如果你的数据足够多,可以不要冻结网络,别人训练好的参数可以作为初始值来使用。

数据扩充

对于计算机视觉领域,训练集的数据总是不够的。为了获取更多的数据,有几种常用的方法。

  1. 普通的方法
    a. 镜像。把图片进行镜像处理,可以得到新的一张图片,能够用来进行训练。
    b. 随机复制。选取图片的某个区域,复制出来保存成图片。这种方法可以得到多张新的训练图片。比如下面这个例子
    深度卷积网络实例分析
    c. 旋转。把图片旋转一定角度,可以得到新的训练集。
    d. 裁剪。
    e. 局部弯曲。

  2. 色彩转换。在图片的每个颜色通道上加上一些失真值,使得图片的颜色有些失真,但不影响图片的识别,比如下面的例子
    深度卷积网络实例分析

在实现数据扩充的实践中,可以使用一个或多个CPU线程来处理图片,比如对图片进行随机复制,旋转,裁剪或者色彩转换,把得到的图片传给训练网络的线程,这样一边产生数据,一边进行训练,可以加快训练效率。

计算机视觉现状

训练的数据越多,学习算法可以越简单,需要更少的手工工程。而训练的数据越少,就越需要手工工程,需要更加复杂的学习算法。
深度卷积网络实例分析
对象检测比较简单,需要的数据比较少,图像识别需要更多的数据,而语音识别需要得更多。

计算机视觉在深度学习这一领域的主要问题是缺少足够的数据。因此,计算机视觉需要非常复杂的卷积网络,需要更多的人工设计卷积网络。

计算机视觉比较注重标准化的基准测试集和比赛。下面是做好基准和赢得比赛的一些技巧:

  • 集成。单独地训练几个神经网络并平均它们的输出。通常这样做可以提高1%或2%的性能。
  • 在测试时multi-crop。在测试图片的不同版本上运行分类器,并平均它们的输出。在数据扩充中,一张图片可以产生多张不同的图片,这些图片的标签值都是一样的。使用分类器对这些图片进行分类,然后对分类结果取平均值。

最后,给出一些对计算机视觉的深度学习的建议:

  • 使用在论文上发表的神经网络架构,
  • 使用开源实现的神经网络,
  • 使用预训练的模型和已经调试好的超参数。