深度卷积网络实例分析

为什么要进行实例分析

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

经典的卷积网络有

  • LeNet,
  • AlexNet,
  • VGG。

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

经典网络

LeNet

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

AlexNet

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

VGG-16

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

残差网络(Residual Networks)

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

ResNet是由残差块构建的,下图是一个残差块
残差块
这里有两个网络层,linear ReLu linear ReLu。经过的计算是

z[l+1]a[l+1]z[l+2]a[l+2]=W[l+1]a[l]+b[l+1]=g(z[l+1])=W[l+2]a[l+1]+b[l+2]=g(z[l+2]) 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] a [ l ] 加到l+2层,与 z[l+2] z [ l + 2 ] 一起进入激活函数, a[l+2]=g(z[l+2]+a[l]) a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) ,这就是跳远连接。

残差网络的结构是这样的
残差网络
残差网络中加入了许多残差块。

随着网络层数的增加,普通神经网络的训练误差会先降低,然后会缓慢提高,而残差网络能够保证训练误差是递减的,如下图所示
普通网络和残差网络的训练误差比较

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

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

最后看看在卷积网络中使用跳远连接的例子
ResNet

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

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

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

Inception

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

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

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

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

卷积网络的迁移学习

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

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

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

数据扩充

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

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

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

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

计算机视觉现状

训练的数据越多,学习算法可以越简单,需要更少的手工工程。而训练的数据越少,就越需要手工工程,需要更加复杂的学习算法。
data and hand-engineering
对象检测比较简单,需要的数据比较少,图像识别需要更多的数据,而语音识别需要得更多。

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

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

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

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

  • 使用在论文上发表的神经网络架构,
  • 使用开源实现的神经网络,
  • 使用预训练的模型和已经调试好的超参数。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值