传统的模式识别方法

  1. 人工设计的特征提取方法+分类器(可以是全连接神经网络)
      1.1图像->特征提取->特征->分类器->数字类别
      1.2 缺点:需要手动设计特征提取方法,通常对于不同的问题需要不同的特征提取方法。而且效果与特征提取方法关系很大。
    2.直接处理图像的全连接神经网络(raw input)
      2.1 图像 -全连接神经网络-数字类别
      2.2 缺点:
      a.参数数量爆炸(起码与图像像素数目成正比):需要大数据集,难以收敛,容易过拟合,会超内存。
      b.不保证对旋转以及局部扭曲的无关性,需要数字图像居中才可以得到较好的准确度(通常难以满足).理论上全连接可以得到旋转以及局部扭曲不变性,即在不同位置都有一个相似的权值单元,但是需要大量的局部移动的训练样本。
      c.忽略了图像的拓扑结构,任意打乱图像的像素顺序不会影响结果。

CNN是深度学习在图像领域的一个应用。那么它相对于原来的神经网络方法有什么不同?为什么它适用于图像领域?

  • 全连接神经网络
      需要的参数过多,例如1000*1000的图像,则输入层有106个节点,若隐藏层也有106个节点,则输入层到隐藏层的参数有10^12个。
  • CNN:局部感知、权值共享
     CNN用局部感知和权值共享大大减少了参数,同时还具备其它优点。它们与自然图像自身具有的特性:特征的局部性与重复性完美贴合。
     * 局部感知
     (是什么)即网络部分连通,每个神经元只与上一层的部分神经元相连,只感知局部,而不是整幅图像(滑窗实现)。
     (可行性)局部像素关系紧密,较远像素相关性弱。因此只需要局部感知,在更高层将局部的信息综合起来就得到了全局的信息。
      受启发于生物视觉系统:局部敏感;对外界认知从局部到全局。
     * 权值共享
      (是什么)从一个局部区域学习到的信息,应用到图像的其它地方去。即用一个相同的卷积核去卷积整幅图像,相当于对图像做一个全图滤波。一个卷积核对应的特征比如是边缘,那么用该卷积核去对图像做全图滤波,即是将图像各个位置的边缘都滤出来。
      (帮助实现不变性)。不同的特征靠多个不同的卷积核实现。
      (可行性)图像的局部统计特征在整幅图像上具有重复性(即位置无关性)。即如果图像中存在某个基本图形,该基本图形可能出现在任意位置,那么不同位置共享相同权值可实现在数据的不同位置检测相同的模式。比如我们在第一个窗口卷积后得到的特征是边缘,那么这个卷积核对应的就是边缘特征的提取方式,那么我们就可以用这个卷积核去提取其它区域的边缘特征。
      注意权重只是对于同一深度切片的神经元是共享的,在卷积层,通常采用多组卷积核提取不同的特征,即对应不同深度切片的特征,不同深度切片的神经元权重是不共享的。另外,偏重对同一深度切片的所有神经元都是共享的。

CNN为什么具有仿射不变性(平移、缩放、旋转等线性变换)?
局部感知、权值共享、池化共同影响形成。

  • 局部感知和权值共享,使得CNN能够在浅层学到比较基础的特征,比如点、线、边缘,高层特征是这些基础浅层特征的组合,即使发生仿射变化,这些基础的特征依然不变,因此最后的识别结果不受到影响。
      用具体的人脸识别的例子来说,到高层时,CNN将这些浅层基础特征组成成更高级的特征,比如人的眼睛、鼻子等,直到全连接层将这种两个眼睛一个鼻子的组合识别为人脸。因此,即使对图像进行平移、缩放、旋转,在浅层依旧能提取出点、线、边缘等基础特征,到高层就能将它们组合成眼睛鼻子,从而最终依旧能被识别为人脸。(一个说法是,平移旋转后的图像到高层对应的特征图一定程度上也是平移旋转后的。过多的平移旋转,最终可能影响到图像的识别,因此更鼓励用data augmentation来实现对旋转的鲁棒。)
  • 池化,比如max pooling,它是取一个区域的最大值。因此当图像发生平移、缩放、旋转等较小的变化时,依然很有可能在同一位置取到最大值,与变化前的响应相同,由此实现了仿射不变性。average pooling同理,发生较小的仿射变化后,均值可能依然不变。
  • 但上述对CNN仿射不变性的解释,都建立在“发生较小的仿射变化”这样的约束上,当发生较大的仿射变化后,可能对CNN的识别结果造成影响。因此,鼓励获取更加丰富的训练样本(进行data augmentation)使得CNN在应用时对新样本有较好的鲁棒性。

卷积层
  卷积层是卷积神经网络的核心基石。在图像识别里我们提到的卷积是二维卷积,即离散二维滤波器(也称为卷积核)与二维图像做卷积操作,简单的讲是二维滤波器滑动到二维图像上所有位置,并在每个位置上与该像素点及其邻域像素点做内积不同卷积核可以提取不同的特征,例如边沿、线性、角等特征。在深层卷积神经网络中,通过卷积操作可以提取出图像低级到复杂的特征。在卷积操作中卷积核是可学习的参数
 卷积核如何设置可以参考卷积神经网络的卷积核大小、个数,卷积层数如何确定呢?一般取(3,3)的小矩阵,卷积核里面每个值就是我们需要寻找(训练)的神经元参数(权重),开始会随机有个初始值,当训练网络时,网络会通过后向传播不断跟新这些参数值,直到寻找到最佳的参数值。如何知道是“最佳”?是通过损失函数去评估。
 卷积核的步长是指卷积核每次移动几个格子,有横行和纵向两个方向。
 卷积操作相当于特征提取,卷积核相当于过滤器,提取我们需要的特征。

1x1卷积核作用

  • 降维/升维
      由于 1×1 并不会改变 height 和 width,改变通道的第一个最直观的结果,就是可以将原本的数据量进行增加或者减少。这里看其他文章或者博客中都称之为升维、降维。但我觉得维度并没有改变,改变的只是 height × width × channels 中的 channels 这一个维度的大小而已
  • 增加非线性
      1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep。
      备注:一个filter对应卷积后得到一个feature map,不同的filter(不同的weight和bias),卷积以后得到不同的feature map,提取不同的特征,得到对应的specialized neuron
  • 跨通道信息互换(channel的变换)
      例子:使用1x1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,3x3,64channels的卷积核后面添加一个1x1,28channels的卷积核,就变成了3x3,28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互
      注意:只是在channel维度上做线性组合,W和H上是共享权值的sliding window

1x1卷积核应用

  • Inception
  • ResNet

感受野的概念

在卷积神经网络中,感受野(Receptive Filed)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域的大熊啊。再通俗点的解释是,特征图上的一个点对应输入图上的区域,如图所示

全连接神经网络优化器 全连接神经网络缺点_全连接神经网络优化器


Padding

卷积操作之后维度变少,得到的矩阵比原来矩阵小,这样不好计算,而我们只是希望做卷积,所以我们需要Padding,在每次卷积操作之前,在原矩阵外边补包一层0,可以只在横向补,或只在纵向补,或者四周都补0,从而使得卷积后输出的图像跟输入图像在尺寸上一致。

比如:我们需要做一个300300的原始矩阵的卷积,用一个33卷积核来扫,扫出来结果的矩阵应该是:298298的矩阵,变小了.卷积前加 Padding 操作补一圈0,即300300矩阵外面周围加一圈“0”,这样的300300就变成了302302的矩阵,再进行卷积出来就是300*300 ,尺寸和原图一样。

“same":向上取整
”valid":向下取整

池化(pooling) #DC143C

  • 池化是非线性下采样的一种形式;
  • 主要作用 是减少网络的参数来减小计算量;
  • 一定程度上控制过拟合;
  • 卷积操作后我们提取了很多特征信息,相邻区域有相似特征信息,可以相互替代的,如果全部保留这些特征就会有信息冗余,增加了计算难度,这时候池化就相当于降维操作。池化是在一个小矩阵区域内,取该区域的最大值或平均值来代替该区域,该小矩阵的大小可以在搭建网络的时候自己设置。小矩阵也是从左上角扫到右下角。

Flatten
Flatten是指将多维的矩阵拉开,变成一维向量来表示。

全连接层

对于n-1层和n层而言,n-1层的任意一个节点,都和第n层所有节点有连接。即第n层的每个节点在进行计算的时候,激活函数的输入是n-1层所有节点的加权。

全连接神经网络优化器 全连接神经网络缺点_卷积核_02


Dropout

dropout是指在网络的训练过程中,按照一定的概率将网络中的神经元丢弃,这样有效防止过拟合。

Parameters和FLOPs
复杂的网络到底需要多少参数才能定义它?数据过一遍这么复杂的网络需要多大的计算量呢?这就是我们要讨论的两个量:parameters和FLOPS

  • parameters :
      * 从Andrew的前向传播PPT中,我们可以知道CNN中的parameters分为两种:W和b,注意这里W是大写,表示一个矩阵,也因此它相比b,既含有更多的信息,同时也是parameters的主要部分。
      * 在AlexNet模型结构图中,每个大长方体中的小长方体就是W,它是大小为[K_h, K_w, C_{in}]的三维矩阵,其中K_h表示卷积核(filter或kernel)的高度,K_w表示卷积核的宽度,C_{in}表示输入的通道数(Channels),一般情况下,K_h和K_w的大小是一样的,且一般比较小,3、5、7之类。
      * 同时由于CNN特点,我们知道,一个卷积核在输入数据上从左往右、从上往下扫一遍,便会计算出很多个前向传播的值,这些值就会按原来相对位置拼成一个feature map,当然一个卷积核提取的信息太过有限,于是我们需要个不同的卷积核各扫数据,于是会产生个feature map,这个feature map再拼在一起就是这一层的输出,也是一个三维矩阵,即大长方体。设每个卷积核扫一遍之后输出的高度和宽度分别为(注意区分两个),同时就是输出的通道数,记作,则输出矩阵大小为。
      * 例如在从AlexNet图中左边第一个大长方体(输入图片)到第二个大长方体(图中是两个并列小长方体,这是作者分布式训练的需要,这里分析时可以将二者并起来看)这个过程,即是从[H, W, C_{in}] = [224, 224, 3]的矩阵,经过[K_h, K_w, C_{in}] = [11, 11, 3]的卷积核,变为[H, W, C_{out}] = [55, 55, 48+48]的矩阵的过程。
      * 注意到两个特点,一是W是一个三维矩阵,通道数始终和输入数据保持一致,所以实际是二维空间的扫描,二是W在扫描的过程中是不变的,即一个卷积核是扫一遍数据而不是某个点。于是对于AlexNet模型的第一层卷积,W的大小是[K_h, K_w, C_{in}] = [11, 11, 3],个数是N,也就是C_{out} = 96,于是这一个卷积层的parameters中权重的个数为(K_h * K_w * C_{in}) * C_{out} = (11 * 11 * 3) * 96 = 34,848
      * 另外对于b,从前向传播公式可以看出,和W是一一对应的,维度也和W是对应的,即[C_{out}, ],还是对于AlexNet的第一个卷积层,parameters中偏置的个数为C_{out} = 96。
      * 于是我们可以总结出规律:对于某一个卷积层,它的parameters个数为:(K_h * K_w * C_{in}) * C_{out} + C_{out},参数定义同上文。
      刚才讲的都是对于卷积层的,对于全连接层,比如AlexNet的后三层,其实要更简单,因为这实际是两组一维数据之间(如果是卷积层过度到全连接层,如上图第5层到第6层,会先将第5层三维数据flatten为一维,注意元素总个数未变)的两两连接相乘,然后加上一个偏置即可。所以我们也可以总结出规律:对于某个全连接层,如果输入的数据有个节点,输出的数据有个节点,它的parameters个数为:。如果上层是卷积层,就是上层的输出三维矩阵元素个数,即三个维度相乘。
  • FLOPs
     首先介绍一个很形似的概念——FLOPS:全称是floating point operations per second,意指每秒浮点运算次数,即用来衡量硬件的计算性能,比如nvidia官网上列举各个显卡的算力(Compute Capability)用的就是这个指标,TeraFLOPS,前缀Tera表示量级:MM,2^12之意。
     这里我们讨论的FLOPs全称是floating point operations,即表示浮点运算次数,小s后缀是复数的缩写,可以看做FLOPS在时间上的积分,区别类似速度和时间。
      同样从Andrew的前向传播PPT中,我们也可以看到,这里的浮点运算主要就是W相关的乘法,以及b相关的加法,每一个W对应W中元素个数个乘法,每一个b对应一个加法,因此好像FLOPs个数和parameters是相同的。
     但其实有一个地方我们忽略了,那就是每个feature map上每个点的权值是共享,这是CNN的一个重要特性,也可以说是优势(因此才获得特征不变性,以及大幅减少参数数量),所以我们在计算FLOPs是只需在parameters的基础上再乘以feature map的大小即可,即**对于某个卷积层,它的FLOPs数量为[(K全连接神经网络优化器 全连接神经网络缺点_卷积神经网络_03 * K全连接神经网络优化器 全连接神经网络缺点_卷积神经网络_04 * C全连接神经网络优化器 全连接神经网络缺点_卷积核_05) * 全连接神经网络优化器 全连接神经网络缺点_卷积_06+全连接神经网络优化器 全连接神经网络缺点_卷积_06](H * W)=num_params(H * W),其中num_params表示该层参数的数目。
      还是里AlexNet网络第一卷积层为例,它的FLOPs数目为: [(11 * 11 * 3) * 96 + 96] * (55 * 55) = 105,705,600。
      对于全连接层,由于不存在权值共享,它的FLOPs数目即是该层参数数目:N_{in} * N_{out} + N_{out}。

卷积各层的参数和链接个数的计算
  卷积神经网络是一个多层的神经网络,每层由多个二维平面组成(每个层有多个Feature Map,每个Feature Map通过一种卷积滤波器提取输入的一种特征),而每个平面由多个独立神经元组成。
  CNN厉害的地方就在于通过感受野和权值共享减少了神经网络需要训练的参数的个数。所谓权值共享就是同一个Feature map中神经元权值共享,该Feature Map 中的所有神经元使用同一组权值。因此:
  a.参数个数:与神经元的个数无关,只与卷积核大小及Feature Map的个数相关。
  b.共有多少个连接个数:就与神经元的个数相关了,神经元的个数也就是特征图的大小