卷积神经网络

提前说一句:转载自吴恩达deeplearning

原文链接:https://blog.csdn.net/ice_actor/article/details/78648780

                  https://blog.csdn.net/ice_actor/article/details/78671349

      

1.边界检测示例

假如你有一张如下的图像,你想让计算机搞清楚图像上有什么物体,你可以做的事情是检测图像的垂直边缘和水平边缘。
这里写图片描述
如下是一个6*6的灰度图像,构造一个3*3的矩阵,在卷积神经网络中通常称之为filter,对这个6*6的图像进行卷积运算,以左上角的-5计算为例
3*1+0*0+1*-1+1*1+5*0+8*-1+2*1+7*0+2*-1 = -5
其它的以此类推,让过滤器在图像上逐步滑动,对整个图像进行卷积计算得到一幅4*4的图像。
这里写图片描述
为什么这种卷积计算可以得到图像的边缘,下图0表示图像暗色区域,10为图像比较亮的区域,同样用一个3*3过滤器,对图像进行卷积,得到的图像中间亮,两边暗,亮色区域就对应图像边缘。
这里写图片描述
通过以下的水平过滤器和垂直过滤器,可以实现图像水平和垂直边缘检测。
这里写图片描述
以下列出了一些常用的过滤器,对于不同的过滤器也有着不同的争论,在卷积神经网络中把这些过滤器当成我们要学习的参数,卷积神经网络训练的目标就是去理解过滤器的参数。
这里写图片描述

2. padding

在上部分中,通过一个3*3的过滤器来对6*6的图像进行卷积,得到了一幅4*4的图像,假设输出图像大小为n*n与过滤器大小为f*f,输出图像大小则为(n−f+1)∗(n−f+1)(n−f+1)∗(n−f+1)。
这样做卷积运算的缺点是,卷积图像的大小会不断缩小,另外图像的左上角的元素只被一个输出所使用,所以在图像边缘的像素在输出中采用较少,也就意味着你丢掉了很多图像边缘的信息,为了解决这两个问题,就引入了padding操作,也就是在图像卷积操作之前,沿着图像边缘用0进行图像填充。对于3*3的过滤器,我们填充宽度为1时,就可以保证输出图像和输入图像一样大。
这里写图片描述
padding的两种模式:
Valid:no padding
输入图像n*n,过滤器f*f,输出图像大小为:(n−f+1)∗(n−f+1)(n−f+1)∗(n−f+1)
Same:输出图像和输入图像一样大

3.卷积步长

卷积步长是指过滤器在图像上滑动的距离,前两部分步长都默认为1,如果卷积步长为2,卷积运算过程为:
这里写图片描述
这里写图片描述
这里写图片描述
加入stride后卷积图像大小的通用计算公式为:
输入图像:n*n,过滤器:f*f步长:s,padding:p
输出图像大小为:⌊(n+2p−fs+1))⌋∗⌊(n+2p−fs+1)⌋⌊(n+2p−fs+1))⌋∗⌊(n+2p−fs+1)⌋,⌊⌋⌊⌋表示向下取整

以输入图像7*7,过滤器3*3,步长为2,padding模式为valid为例输出图像大小为:⌊(7+2∗0−32+1)⌋∗⌊7+2∗0−32+1)⌋=3∗3⌊(7+2∗0−32+1)⌋∗⌊7+2∗0−32+1)⌋=3∗3

4.彩色图像的卷积

以上讲述的卷积都是灰度图像的,如果想要在RGB图像上进行卷积,过滤器的大小不在是3*3而是有3*3*3,最后的3对应为通道数(channels),卷积生成图像中每个像素值为3*3*3过滤器对应位置和图像对应位置相乘累加,过滤器依次在RGB图像上滑动,最终生成图像大小为4*4。
这里写图片描述
另外一个问题是,如果我们在不仅仅在图像总检测一种类型的特征,而是要同时检测垂直边缘、水平边缘、45度边缘等等,也就是多个过滤器的问题。如果有两个过滤器,最终生成图像为4*4*2的立方体,这里的2来源于我们采用了两个过滤器。如果有10个过滤器那么输出图像就是4*4*10的立方体。
这里写图片描述

5.单层卷积网络

通过上一节的讲述,图像通过两个过滤器得到了两个4*4的矩阵,在两个矩阵上分别加入偏差b1b1和b2b2,然后对加入偏差的矩阵做非线性的Relu变换,得到一个新的4*4矩阵,这就是单层卷积网络的完整计算过程。用公式表示:

z[1]=w[1]a[0]+b[1]z[1]=w[1]a[0]+b[1]

a[1]=g(z[1])a[1]=g(z[1])


其中输入图像为a[0]a[0],过滤器用w[1]w[1]表示,对图像进行线性变化并加入偏差得到矩阵z[1]z[1],a[1]a[1]是应用Relu激活后的结果。
这里写图片描述

 

  • 如果有10个过滤器参数个数有多少个呢?
    每个过滤器都有3*3*3+1=28个参数,3*3*3为过滤器大小,1是偏差系数,10个过滤器参数个数就是28*10=280个。不论输入图像大小参数个数是不会发生改变的。
  • 描述卷积神经网络的一些符号标识:
    ll为一个卷积层:
    f[l]f[l]:第ll层过滤器的大小
    p[l]p[l]:第ll层padding的数量
    s[l]s[l]:第ll层步长大小
    nlCnCl:过滤器的个数
    Input:
    nl−1H×nl−1W×nl−1CnHl−1×nWl−1×nCl−1:l−1l−1层输入图像的高、宽以及通道数。
    Output:
    nlH×nlW×nlCnHl×nWl×nCl:输出图像的高、宽以及通道数
    输出图像的大小:
    nlH=⌊nl−1H+2∗pl−f[l]sl+1⌋nHl=⌊nHl−1+2∗pl−f[l]sl+1⌋
    nlW=⌊nl−1W+2∗pl−f[l]sl+1⌋nWl=⌊nWl−1+2∗pl−f[l]sl+1⌋
    输出图像的通道数就是过滤器的个数
    这里写图片描述

6.简单卷积网络示例

  • 输入图像:39*39*3,符号表示:n[0]H=n[0]W=39nH[0]=nW[0]=39 ;n[0]c=3;nc[0]=3
  • 第1层超参数:f[l]=3f[l]=3(过滤器大小);s[l]=1s[l]=1(步长);p[l]=0p[l]=0(padding大小);n[l]C=10nC[l]=10(过滤器个数)
  • 第1层输出图像:37*37*10,符号表示:n[1]H=n[1]W=37nH[1]=nW[1]=37 ;n[1]c=10;nc[1]=10
  • 第2层超参数:f[2]=5f[2]=5;s[2]=2s[2]=2;p[2]=0p[2]=0;n[2]C=20nC[2]=20
  • 第2层输出图像:17*17*20,符号表示:n[2]H=n[2]W=17nH[2]=nW[2]=17 ;n[2]c=20;nc[2]=20
  • 第3层超参数:f[3]=5f[3]=5;s[3]=2s[3]=2;p[2]=0p[2]=0;n[3]C=40nC[3]=40
  • 第3层输出图像:7*7*40,符号表示:n[3]H=n[3]W=17nH[3]=nW[3]=17 ;n[3]c=40;nc[3]=40
  • 将第三层的输出展开成1960个元素
  • 然后将其输出到logistic或softmax来决定是判断图片中有没有猫,还是想识别图像中K中不同的对象
    这里写图片描述
    卷积神经网络层的类型:
  • 卷积层(convolution,conv)
  • 池化层(pooling,pool)
  • 全连接层(Fully connected,FC)

7.池化层

最大池化(Max pooling)
最大池化思想很简单,以下图为例,把4*4的图像分割成4个不同的区域,然后输出每个区域的最大值,这就是最大池化所做的事情。其实这里我们选择了2*2的过滤器,步长为2。在一幅真正的图像中提取最大值可能意味着提取了某些特定特征,比如垂直边缘、一只眼睛等等。
这里写图片描述
以下是一个过滤器大小为3*3,步长为1的池化过程,具体计算和上面相同,最大池化中输出图像的大小计算方式和卷积网络中计算方法一致,如果有多个通道需要做池化操作,那么就分通道计算池化操作。
这里写图片描述
平均池化和最大池化唯一的不同是,它计算的是区域内的平均值而最大池化计算的是最大值。在日常应用使用最多的还是最大池化。
这里写图片描述
池化的超参数:步长、过滤器大小、池化类型最大池化or平均池化

8.卷积神经网络示例

以下是一个完整的卷积神经网络,用于手写字识别,这并不是一个LeNet-5网络,但是设计令该来自于LeNet-5。
这里写图片描述
网络各层参数个数表:
这里写图片描述

--------------------- 本文来自 ice_actor 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/ice_actor/article/details/78648780?utm_source=copy

第二部分,接着上面的继续讲!

1.前言

  在卷积神经网络入门一节中,讲述了卷积神经网络的基本构建,比如卷积层、池化层以及全连接层,在过去很长一段时间,计算机视觉的大量研究都集中在如何组合这些基本构建,形成有效的神经网络。实际中在计算机视觉中表现良好的网络往往也适用于其它的任务,比如其它人训练了一个识别猫的网络结构,而你的任务是自动驾驶,你完全可以借鉴别人的神经网络框架。

2.经典网络:

  • LeNet-5这里写图片描述
    • 参数个数:约6万个
    • 随着网络越深,图像大小(nH,nWnH,nW)在缩小,通道数(nCnC)在增加
    • 一个或多个卷积网络后面接池化层的思想至今仍在使用
    • 原论文[1]
  • AlexNet这里写图片描述
    • 参数个数:6000万个
    • 在训练图像和数据集时AlexNet能够用非常相似的基本构造模块,这些模块通常包含大量的隐藏单元或数据,这使得AlexNet有非常惊艳的效果。
    • AlexNet比LeNet表现好的另外一个原因是使用了Relu激活函数
    • 从这篇论文后人们开始确信深度学习可以应用于计算机视觉领域
    • 原论文[2]
  • VGG - 16这里写图片描述
    • 参数个数:1.38亿个参数
    • 每一组卷积网络的过滤器个数翻倍
    • vgg-16和vgg-19网络效果差不多,大部分人还是使用vgg-16
    • vgg-16 网络没有那么多的超参数,这是一种专注于构建卷积层的简单网络
    • vgg的优点是简化了神经网络结构
    • 原论文[3]

3.残差网络

  非常非常深的卷积网络是很难训练的,因为存在梯度消失和梯度爆炸问题,ResNets可以构建100层以上的神经网络。

  1. Residual Block(残差块)
    这里写图片描述
      假设有有一个两层的卷积网络,从ll层到l+2l+2层,通常神经网络的处理流程是:
  2. a[l]a[l]线性变换:z[l]=W[l+1]a[l]+b[l+1]z[l]=W[l+1]a[l]+b[l+1]
  3. RELU非线性激活:a[l+1]=g(z[l+1])a[l+1]=g(z[l+1])
  4. a[l+1]a[l+1]线性变换:z[l+2]=W[l+2]a[l+1]+b[l+2]z[l+2]=W[l+2]a[l+1]+b[l+2]
  5. RELU非线性激活:a[l+2]=g(z[l+2])a[l+2]=g(z[l+2])

    残差网络和普通网络的差异是,a[l+2]a[l+2]在进行非线性变化前,把a[l]a[l]的数据拷贝了一份与z[l+1]z[l+1]累加后进行了非线性变换,也就是说第4部和之前有所不同:
    4′4′. RELU非线性激活:a[l+2]=g(a[l]+z[l+2])a[l+2]=g(a[l]+z[l+2])
    残差网络就是这些残差块的堆叠,通过这种方式可以把网络设计的很深。
    对于普通的卷积网络,用梯度下降等常用的优化算法进行优化,随着网络深度的增加,训练误差会呈现出先降低后增加的趋势,而我们期望的理想结果是随着网络深度的增加训练误差逐渐减小,而ResNets随着网络深度的增加训练误差会一直减小,有人在1000层的卷积网络上做过实验,依然呈现出这个趋势。
    这里写图片描述
    为什么ResNet会有这么好的表现呢?
      通常网络在训练集上表现好,才能在Hold-Out交叉验证集或测试集上有好的表现。从上一部分得出的结论,残差块的输出可以表示为:

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


      如果W[l+2]=0W[l+2]=0,b[l+2]=0b[l+2]=0那么等式就变成了a[l+2]=g(a[l])=a[l]a[l+2]=g(a[l])=a[l](Relu激活函数),结果表明,残差块学习这个恒等式并不困难,由于skip connection使我们很容易得到a[l+2]=a[l]a[l+2]=a[l],这也就意味着即使给神经网络增加了两层,它的效率也不逊色于更简单的神经网络,因为学习恒等函数还是很简单的,我们的目标并不仅仅是为了提升网络的效率,如果残差块中的隐藏单元学习到一些有用信息,那么它可能比学习恒等式函数表现更好。ResNet起作用的主要原因也是学习恒等函数非常容易。
    这里写图片描述
    作者论文中给出的普通卷积网络和ResNets网络的网络结构图对比:这里写图片描述

     

4. 1××1网络

  1. 为什么要做1×11×1卷积
      对于一个6*6的灰度图像做1×11×1卷积就相当于给每个元素放大或缩小相同的倍数,其实没有什么用处,如果输入图像不是6*6的灰度图像而是一个6*6*32有32个通道的图像,那1××1的大小为1*1*32,计算6*6*32每个像素32个通道与1××1对应位置的乘积累加得到一个实数,6*6每个像素都进行相应的运算最终重新得到一幅6*6的图像,输出图像的通道数就等于1*1*32网络过滤器的个数。1××1的网络可以从根本上理解为全连接的网络。
    这里写图片描述
      以下是示例,对于一个28*28*192的输入图像,输入图像通道数是192,如果你想得到一个有32个通道的输出图像,怎么处理?就可以使用包含32个过滤器的1××1网络。换个角度理解就是,池化层是压缩图像宽度和高度,而1××1网络可以压缩图像的通道数。
    这里写图片描述

5.Inception网络

  在构建卷积层时,通常要决定过滤器的大小究竟是3×33×3还是5×55×5或者要不要添加池化层,Inception网络的作用就是代替你来做决定。
  如下图所示,输入层是一个28*28*192维度的图像,Inception网络的作用就是代替人工来确定卷积层中过滤器的类型,或者确定是否需要创建卷积层或池化层。下图输入图像通过64个1*1过滤器、128个3*3过滤器、32个5*5过滤器以及32个最大池化过滤器输出图像大小仍然为28*28,通道数是经各个过滤器卷积后输出结果的累加。
这里写图片描述
这个算法的计算成本如何呢?
  以5*5过滤器为例,卷积过程中输出数值个数为28∗28∗3228∗28∗32,对于输出中每个数值都需要执行5*5*192次乘法运算,所以乘法运算的总次数为28∗28∗32∗5∗5∗192=1.2亿28∗28∗32∗5∗5∗192=1.2亿,成本还是相当高的。
这里写图片描述
  另外一种输入是28*28*192,输出是28*28*32的架构是使用1×11×1卷积,对于输入层使用1×11×1卷积,把输入数值从192个通道减少到16个通道,然后对这个较小层运行5*5卷积,得到最终结果,中间这个28*28*16层有时被称为瓶颈层(bottleneck),这个算法的计算成本:
1*1网络:28*28*16*192=240万
5*5网络:28*28*32*5*5*16=1000万
  总共的计算成本为1240万,相比于之前的1.2亿,计算成本较少为之前的十分之一。事实证明,只要合理的设计bottleneck层,既可以显著缩小表示层规模,又不会降低网络性能,从而节省大量计算成本。
这里写图片描述
Inception Module
下图的Inception Module包含了几个字模块:

  1. 输入图像28*28*192—>1*1 conv—>输出图像28*28*64
  2. 输入图像28*28*192—>1*1 conv—>3*3 conv—>输出图图像28*28*128
  3. 输入图像28*28*192—>1*1 conv—>5*5 conv—>输出图像28*28*32
  4. 输入图像28*28*192—>3*3 maxpool—>1*1 conv—>输出图像28*28*32
      将所有的输出结构进行channel concat得到一个28*28*256的输出,整个这个流程就是一个Inception module
    这里写图片描述

  Inception network其实即使把多个Inception Module进行堆叠形成的网络结构,网络中还会穿插一些maxpooling操作。还有一些细节就是Inception网络在中间隐藏层会有softmax输出,它们也可以预测图片的分类,它在Inception网络中起到一种调节作用,并能防止网络发生过拟合。[5]
这里写图片描述

6.迁移学习

  如果要做一个计算机视觉的应用,x相比于从头训练权重,下载别人已经训练好的网络结构的权重,作为你训练模型的初始权重,通常能够进展的相当快。
  如果要训练一个三分类的网络,可以从网络上下载已有的网络结构代码,同时也要把网络结构的权重下载下来,比如ImageNet数据集分类的一个网络结构,但是ImageNet有1000多个类别,所以我们需要把输出的softamx单元修改成3个类别。
这里写图片描述
1. 如果有很少的训练数据集
  可以只训练softmax输出单元的参数,冻结其它层的参数,在不同的框架中通常会有trainableParameter或freeze参数来控制要训练的层。由于除了softmax单元外其它的都是固定的参数,所以可以建立一个从输入图像x到softmax单元前激活层的映射关系,存储到硬盘上来加速训练。这里训练的就是一个很浅层的网络。
2. 如果有一定数量的训练集
  可以冻结更少层的参数,然后训练后面的层,并把输出层修改成你训练任务对应的输出,也可以把后面层删除换成自己的网络。
3. 如果有足够数量的训练集
   可以仅用先有的参数进行初始化,不冻结任何层。
总的来说,你拥有的数据越多,就可以训练越多的层,极端情况下可以用下载的权重只做初始化。

常用数据集:ImageNet、coco、pascal

7.数据扩充

  大部分的计算机视觉任务使用很多的数据,所以数据增强是常用的方法来提高计算机视觉系统的表现,计算机视觉是相当复杂的工作,需要输入图像的像素值,然后弄清楚图像中有什么,在实践中更多的数据对大多数计算机视觉任务都有帮助,不像其它领域有时候得到充足的数据但是效果并不怎么样,但是计算机视觉的主要问题是没有办法得到充足的数据。
常见的数据增强方法:

仿射变换
2. 垂直镜像对称(mirrors)
对大多数图像镜像对称保留了图像中想要识别的物体。
3. 随机裁剪(random cropping)
随机获取图像的子区域,放在数据集中。随机裁剪并不是一个完美的数据增强方法。
4. 旋转(rotation)
5. 裁剪(shearing)
6. 局部扭转(Local warping)
4,5,6由于实现比较复杂,在实际中应用并不多。
这里写图片描述

色彩转换
通过改变RGB三通道的值,来得到失真的图像,下图
1. R+20,G-20,B+20得到偏紫的图像
2. R-20,G+20,B+20得到偏黄的图像
3. R+5,G+0,B+50使用更多的蓝色,这是根据某种概率分布来决定的,这样做的理由是跟接近阳光色或灯光颜色
这样做使你的算法对颜色更改更具有鲁棒性

  颜色采样的方式有多种,其中一种影响颜色扭曲的算法是PCA,具体颜色改变的细节在AlexNet的论文中,有时候称为PCA颜色增强,大概意思是,比如你的图片呈现紫色,即主要含有红色和蓝色,绿色很少,然后PCA颜色增强算法对红色和蓝色增减多,绿色变化相对少一点,所以使总体颜色保持一致
这里写图片描述

实际处理中的一些流程
这里写图片描述

参考文献

[1] Gradient-based learning applied to document recognition.LeCun et al.1998.
[2] ImageNet classification with deep convolutional neural networks.Krizhevky et al.2012.
[3]Very deep convolutional networks for large-scale image recognition.simonyan et al.2015.
[4]deep residual networks for image recognition. He et al.2015.
[5]Going deeper with Convolutions.Szegedy et al.2014.

--------------------- 本文来自 ice_actor 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/ice_actor/article/details/78671349?utm_source=copy

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值