学习笔记——卷积神经网络CNN的理解

参考:
https://blog.csdn.net/weixin_42451919/article/details/81381294
https://blog.csdn.net/yjl9122/article/details/70198357?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://www.jianshu.com/p/1ea2949c0056

感知机 Perceptron

(结合《机器学习》5.1-5.2节)

感知机由两层神经元组成,分别为输入层与输出层(M-P神经元),是二元线性分类器。神经网络是以感知机为单元的集合。
学习笔记——卷积神经网络CNN的理解_第1张图片
如上图所示,输入 x1 和 x2 分别和各自的权重 w1 和 w2 相乘、求和,所以函数 f=x1w1+x2w2+b(偏置项,可以选择性地添加)。函数 f 可以是任意的运算,但是对于感知机而言通常是求和。函数 f 随后会通过一个激活函数来评估,该激活函数能够实现期望分类。Sigmoid 函数是用于二元分类的最常见的激活函数。(输出层/M-P神经元 = 函数 f + 激活函数)

神经网络

把多个输入堆叠在一起,并且使用函数 f 将其与位于另一层的多个堆叠在一起的单元连接在一起,这就形成了多个全连接的感知机;隐藏层单元的输出成为最后一个单元的输入,再通过函数 f 和激活函数得到最终的分类。

神经网络的分类:

  • 前馈神经网络(Feedforward Neural Network,FNN):最简单的神经网络,单向多层结构。每个神经元只与前一层的神经元相连,接收前一层的输出,并输出给下一层,各层间没有反馈,即信息流是单向无环的。包括感知器网络、BP网络、RBF网络、卷积神经网络等。
  • 反馈神经网络:是一种反馈动力学系统。在这种网络中,每个神经元同时将自身的输出信号作为输入信号反馈给其他神经元,它需要工作一段时间才能达到稳定。

如下图所示,这个就是最简单的神经网络/前馈神经网络。当数百个输入连接到数个这样的隐藏层,则会形成一个复杂的神经网络,通常被称为深度神经网络或者深度前馈神经网络
学习笔记——卷积神经网络CNN的理解_第2张图片
神经网络被称作泛逼近函数(Universal Approximation function),其拓扑和结构变体是很多样化的,因此神经网络可以模拟任何函数。

四种基本的神经网络架构:

  • 卷积神经网络 CNN:卷积神经网络与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层子采样层构成的特征抽取器,且具有深度结构。
  • 循环/递归神经网络 RNN
  • 深度信念网络 DBN
  • 生成对抗网络 GAN

卷积神经网络 CNN

卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元。由INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层)组成,最后进行分类回归

卷积神经网络的层级结构

  • 数据输入层/ Input layer
  • 卷积计算层/ CONV layer
  • ReLU激励层 / ReLU layer
  • 池化层 / Pooling layer
  • 全连接层 / FC layer

卷积神经网络与全连接神经网络的对比
学习笔记——卷积神经网络CNN的理解_第3张图片

  • 左图:全连接神经网络(平面),组成:输入层、激活函数、全连接层
  • 右图:卷积神经网络(立体),组成:输入层、卷积层、激活函数、池化层、全连接层
  • 在卷积神经网络中有一个重要的概念:深度

1.数据输入层(input layer, INPUT)

该层主要是对原始图像数据进行预处理,其中包括:

  • 去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。
  • 归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰。比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。
  • PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化。

去均值与归一化效果图:
学习笔记——卷积神经网络CNN的理解_第4张图片
去相关与白化效果图:
学习笔记——卷积神经网络CNN的理解_第5张图片

2.卷积层(convolutional layer, CONV)

由若干卷积核/滤波器组成,其目的是在原始的输入上进行特征提取,即在原始输入上一个小区域一个小区域进行特征的提取。

名词解释

  • 滤波器(filter):用于提取图像特征,它使用优化算法来决定矩阵中的权重参数。可在神经网络的一层卷积操作中使用多个滤波器来提取多个特征(一个滤波器提取一个特征/得到一个特征图)。此外,滤波器的深度必须和输入图像的深度相同

  • 输入图像大小(Input Size):要求为整数。

  • 滤波器的大小(Kernel Size):要求为整数或者列表等。

  • 步长(Stride):滤波器窗口滑动的大小。

  • 填充(Zero-padding):零填充指在输入图像的边界周围补充零,以使尽可能多地保留原始输入内容的信息,或直接使输入图像和卷积后的特征图具有相同的维度。一般F=3 => zero pad with 1、F=5 => zero pad with 2、F=7=> zero pad with 3

  • 输出图像大小(Output Size):Output_size = 1 + ( Input_size + 2 * Padding - Kernel_size ) / Stride

  • 感受野/窗口(Receptive Field):卷积神经网络每一层输出的特征图上每个像素点在原始图像上映射的区域大小。其值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。

单色图像的卷积

假设一张单色图像有 5x5 个像素,1 代表白,0 代表黑。用一个由随机地 0 和 1 组成的 3x3 矩阵(即滤波器)去和图像中的子区域做乘法,每次迭代移动一个像素,这样该乘法会得到一个新的 3x3 的矩阵。下面的动图展示了这个过程。
学习笔记——卷积神经网络CNN的理解_第6张图片

RGB图像的卷积

RGB图像是三通道,即其深度为3(即R、G、B),由于滤波器的深度必须和输入图像的深度相同,因此滤波器的深度也为3。

下图展示了使用两个三通道滤波器从三通道(RGB)图像中生成两个卷积输出的详细过程,输出是提取到的特征。

  • 左区域三个大矩阵是原图像的输入,RGB三个通道用三个矩阵表示,大小为7x7x3。
  • Filter W0表示1个filter,尺寸为3x3,深度为3(三个矩阵);Filter W1也表示1个filter。因为卷积中用了2个filter,因此该卷积层结果的输出深度为2(绿色矩阵有2个)。
  • Bias b0是Filter W0的偏置项,Bias b1是Filter W1的偏置项。
  • OutPut是卷积后的输出,尺寸为3x3,深度为2。

学习笔记——卷积神经网络CNN的理解_第7张图片
计算过程:

  1. 在输入矩阵上有一个和filter相同尺寸的滑窗,然后将输入矩阵在滑窗里的部分与filter矩阵对应位置相乘,相乘后求和,得到一个整数结果,3个通道即有3个整数结果;
  2. 将3个矩阵产生的结果求和,并加上偏置项bias,从而得到了输出矩阵中的一个整数结果;
  3. 滑动窗口2个步长,重复之前步骤进行计算;
  4. 最终可以得到,在2个filter下,卷积后生成的深度为2的输出结果。

下图是用了两个filter得到了两个特征图,输入图像是32x32x3,卷积层是一个5x5x3的Filter。通过一个Filter与输入图像的卷积可以得到一个28x28x1的特征图。
学习笔记——卷积神经网络CNN的理解_第8张图片
下图使用了6个Filter分别卷积进行特征提取,最终得到6个特征图。将这6层叠在一起就得到了卷积层输出的结果(深度为6)。
学习笔记——卷积神经网络CNN的理解_第9张图片
卷积不仅限于对原始输入的卷积。蓝色方块是在原始输入上进行卷积操作,使用了6个filter得到了6个提取特征图。绿色方块还能对蓝色方块进行卷积操作,使用了10个filter得到了10个特征图。每一个filter的深度必须与上一层输入的深度相等。
学习笔记——卷积神经网络CNN的理解_第10张图片
如下图,第一次卷积可以提取出低层次的特征,第二次卷积可以提取出中层次的特征,第三次卷积可以提取出高层次的特征。特征是不断进行提取和压缩的,最终能得到比较高层次特征,简言之就是对原式特征一步又一步的浓缩,最终得到的特征更可靠。利用最后一层特征可以做各种任务:比如分类、回归等。
学习笔记——卷积神经网络CNN的理解_第11张图片
卷积层的输出尺寸

输 出 宽 度 / 高 度 = 1 + ( 输 出 宽 度 / 高 度 + 2 × 填 充 − 滤 波 器 宽 度 / 高 度 ) 移 动 步 长 输出宽度/高度 = 1 + \frac{ ( 输出宽度/高度 + 2 \times 填充 - 滤波器宽度/高度 ) }{移动步长} /=1+(/+2×/)
如下图:
学习笔记——卷积神经网络CNN的理解_第12张图片
权值共享机制

当用一个filter去扫一张输入图像,filter里面的数叫权重,这张图每个位置是被同样的filter扫的,所以权重是一样的,也就是共享。
学习笔记——卷积神经网络CNN的理解_第13张图片
同上图,特征图由10个32x32x1的特征图组成,即每个特征图上有32x32x1=1024个神经元,每个神经元对应输入图像上一块5x5x3的区域,即一个神经元和输入图像的这块区域有5x5x3=75个连接,即75+1=76个权值参数(+1是偏置项bias),则共有76x1024x10=778240个权值参数,这是非常复杂的。
引入权值共享机制后,即一个特征图上每个神经元对应的76个权值参数被每个神经元共享,这样则只需76x10=760个权值参数,而每个特征图内的阈值也共享,即需要10个阈值,则总共需要760+10=770个参数。

3.非线性层(激活函数)

在每个卷积层之后,通常会立即应用一个非线性层(激活函数),其目的是给一个在卷积层中刚经过线性计算操作(只是数组元素依次相乘与求和)的系统引入非线性特征
学习笔记——卷积神经网络CNN的理解_第14张图片

激活函数应该具有的性质: 目前常用的激活函数都只拥有下述性质的部分

  • 非线性。线性激活层对于深层神经网络没有作用,因为其作用以后仍然是输入的各种线性变换。
  • 连续可微。梯度下降法的要求。
  • 范围最好不饱和,当有饱和的区间段时,若系统优化进入到该段,梯度近似为0,网络的学习就会停止。
  • 单调性,当激活函数是单调时,单层神经网络的误差函数是凸的,好优化。
  • 在原点处近似线性,这样当权值初始化为接近0的随机值时,网络可以学习的较快,不用可以调节网络的初始值。

常见的激活函数:

  • Sigmoid函数(目前已被淘汰)
    S i g m o i d ( x ) = 1 1 + e − x Sigmoid(x) = \frac 1{1+e^{-x}} Sigmoid(x)=1+ex1
    缺点:
    ① 饱和时梯度值非常小。
    由于BP算法反向传播的时候后层的梯度是以乘性方式传递到前层,因此当层数比较多的时候,传到前层的梯度就会非常小,网络权值得不到有效的更新,导致网络较底层的训练速度非常慢,即梯度耗散/梯度消失。如果该层的权值初始化使得f(x) 处于饱和状态时,网络基本上权值无法更新。
    ② 输出值不是以0为中心值。

  • Tanh函数
    T a h n ( x ) = 2 σ ( 2 x ) − 1 Tahn(x) = 2σ(2x)-1 Tahn(x)=2σ(2x)1
    其中σ(x)为sigmoid函数,仍然具有饱和的问题。

  • ReLU函数
    Alex在2012年提出的一种新的激活函数,很大程度的解决了BP算法在优化深层神经网络时的梯度耗散问题。最常用,也称为线性整流函数/修正线性单元,注意学习率的设置以及死亡节点所占的比例即可。
    R e L U ( x ) = m a x ( 0 , x ) ReLU(x) = max(0,x) ReLU(x)=max(0,x)
    ReLU函数把所有的负激活(negative activation)都变为零,其图像如下:学习笔记——卷积神经网络CNN的理解_第15张图片优点:
    ① x>0时,求梯度简单,梯度恒为1,无梯度耗散/梯度消失问题,收敛快。
    ② 增大了网络的稀疏性。当x<0时,该层的输出为0,训练完成后为0的神经元越多,稀疏性越大,提取出来的特征就越具有代表性,泛化能力越强。即得到同样的效果,真正起作用的神经元越少,网络的泛化性能越好。
    ③ 运算量很小,在准确度不发生明显改变的情况下能令训练速度提高很多,计算效率增加。
    缺点:
    ① 较脆弱,如果后层的某一个梯度特别大,导致W更新以后变得特别大,导致该层的输入<0,输出为0,这时该层就会‘die’,没有更新。当学习率比较大时可能会有40%的神经元都会在训练开始就‘die’,因此需要对学习率进行一个好的设置。
    ② 由优缺点可知max(0,x) 函数为一个双刃剑,既可以形成网络的稀疏性,也可能造成有很多永远处于‘die’的神经元,需要trade-off。
    学习笔记——卷积神经网络CNN的理解_第16张图片

  • Leaky ReLU/PReLU函数
    对于Leaky ReLU,a是固定的,是模型训练前提前设定的;对于PReLU,a是未知的,是模型训练中得到的。总结为Leaky ReLU中a是超参数,PReLU中a是参数。
    L e a k y   R e L U / P R e L U ( x ) = { x ,      x ≥ 0 a x ,    x < 0 Leaky\ ReLU/PReLU(x) = \begin{cases} x,\ \ \ \ x\geq0 \\ ax,\ \ x<0 \end{cases} Leaky ReLU/PReLU(x)={x,    x0ax,  x<0
    a 处于(0,1)区间内。Leaky ReLU/PReLU函数改善了ReLU的死亡特性,但是也同时损失了一部分稀疏性,且增加了一个超参数/参数,目前来说其好处不太明确。

  • Maxout函数
    M a x o u t ( x ) = m a x ( w 1 T x + b 1 , w 2 T x + b 2 , . . . , w k T x + b k ) Maxout(x) = max(w^T_1x+b_1, w^T_2x+b_2,...,w^T_kx+b_k) Maxout(x)=max(w1Tx+b1,w2Tx+b2,...,wkTx+bk)
    泛化了ReLU和Leaky ReLU,改善了死亡特性,但是同样损失了部分稀疏性,每个非线性函数增加了两倍的参数。

激励层的实践经验

  • 不要用sigmoid!
  • 首先试ReLU,因为快,但要小心点
  • 如果ReLU失效,请用Leaky ReLU或者Maxout
  • 某些情况下Tanh有不错的结果,但是很少

4.池化层(pooling layer, POOL)

池化也称为下采样,池化层对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征,减小特征空间维度/降维提供空间方差,但不会减小深度。

池化层的具体作用

  • 特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
  • 特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,对不同位置的特征进行聚合统计,把最重要的特征抽取出来,这也是池化操作的一大作用。
  • 在一定程度上防止过拟合,更方便优化。

两种池化操作:

  • 平均池化(average pooling)
  • 最大池化(max pooling)

其中,最大池化是两者中使用最多的一个操作,其效果一般要优于平均池化。当使用最大池化层时,采用输入区域的最大数量,而当使用平均池化时,采用输入区域的平均值。示例如下:
学习笔记——卷积神经网络CNN的理解_第17张图片
学习笔记——卷积神经网络CNN的理解_第18张图片

5.全连接层(fully connected layer, FC)

全连接层通常在卷积神经网络尾部,它将最后一个卷积层的输出展平,即把其拉成一个列项向量。全连接层中的每个神经元与其前一层的所有神经元进行全连接。全连接层可以整合卷积层或者池化层中具有类别区分性的局部信息,将输出值送给分类器(如softmax分类器)。
学习笔记——卷积神经网络CNN的理解_第19张图片

全连接层的参数

全连接层参数特多,可占整个网络参数80%左右。

  • 全接解层的总层数(长度)
  • 单个全连接层的神经元数(宽度)
  • 激活函数(一般用ReLu函数

例子1:

经过卷积、ReLU后得到3x3x5的输出,全连接层如何把3x3x5的ReLU输出转换成1x4096的形式?
学习笔记——卷积神经网络CNN的理解_第20张图片
如上图,全连接层中的每一层是由许多神经元组成的(1x4096)的平铺结构。
如下图,分别用4096个3x3x5的filter(与ReLU输出相同尺寸)去卷积ReLU输出(相加求和得到1个值),每个filter卷积得到的结果就是全连接层的1个神经元的输出,这个输出就是1个值,最后得到4096个值。学习笔记——卷积神经网络CNN的理解_第21张图片
例子2:

如下图,最后的两列小圆球就是两个全连接层,在最后一层卷积结束后,进行了最后一次池化,输出了20x12x12的特征图,然后通过了一个全连接层变成了100x1的向量。全连接层中有100个20x12x12的卷积核,对于输入的每一张特征图,用了一个和特征图一样大小的核卷积,如果厚度是20就是用20个核卷积完了之后相加求和,这样整幅图就变成了一个数了。
学习笔记——卷积神经网络CNN的理解_第22张图片
全连接层的目的

全连接层实现分类,并大大减少特征位置对分类带来的影响。
学习笔记——卷积神经网络CNN的理解_第23张图片
从上图可以看出,猫在不同的位置,输出的特征值相同,但是位置不同。对于电脑来说,特征值相同,但是特征值位置不同,那分类结果也可能不一样。这时全连接层filter的作用就相当于“喵在哪我不管,我只要喵”,即把特征图整合成一个值,若这个值大,则有喵,若这个值小,则可能没喵,结果和这个喵在哪关系不大了,鲁棒性有大大增强。
但因为空间结构特性被忽略了,所以全连接层不适合用于在方位上找Pattern的任务,比如segmentation。

多层全连接层

全连接层中一层的一个神经元就可以看成一个多项式,可用许多神经元去拟合数据分布,但是只用一层全连接层有时候没法解决非线性问题,而如果有两层或以上全连接层就可以很好地解决非线性问题了。

注意:
全连接层的权重矩阵是固定的,即每一次特征图的输入过来必须都得是一定的大小(即与权重矩阵正好可以相乘的大小),所以网络最开始的输入图像尺寸必须固定,才能保证传送到全连接层的特征图的大小跟全连接层的权重矩阵匹配。

一般CNN结构

1.INPUT
2.[[CONV -> RELU]*N -> POOL]*M
3.[FC -> RELU]*K
4.FC
学习笔记——卷积神经网络CNN的理解_第24张图片

卷积神经网络之训练算法

  1. 同一般机器学习算法,先定义Loss function,衡量和实际结果之间差距。
  2. 找到最小化损失函数的W和b, CNN中用的算法是SGD(随机梯度下降)。

卷积神经网络之优缺点

优点

  • 共享卷积核,对高维数据处理无压力
  • 无需手动选取特征,训练好权重,即得特征分类效果好

缺点

  • 需要调参,需要大样本量,训练最好要GPU
  • 物理含义不明确(也就说,我们并不知道没个卷积层到底提取到的是什么特征,而且神经网络本身就是一种难以解释的“黑箱模型”)

卷积神经网络之典型CNN

  • LeNet,这是最早用于数字识别的CNN
  • AlexNet, 2012 ILSVRC比赛远超第2名的CNN,比LeNet更深,用多层小卷积层叠加替换单大卷积层。
  • ZF Net, 2013 ILSVRC比赛冠军
  • GoogLeNet, 2014 ILSVRC比赛冠军
  • VGGNet, 2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet,但是在很多图像转化学习问题(比如object detection)上效果奇好

卷积神经网络之 fine-tuning/微调

fine-tuning:由于数据集不够大,很少有人从头开始训练网络,因此使用已用于其他目标、预训练好模型的权重或者部分权重,作为初始值开始训练。

为什么不用随机选取选几个数作为权重初始值

  • 从头训练卷积神经网络容易出现问题。
  • fine-tuning能很快收敛到一个较理想的状态,省时又省心。

fine-tuning的具体做法

  • 复用相同层的权重,新定义层取随机权重初始值
  • 调大新定义层的的学习率,调小复用层学习率

卷积神经网络的常用框架

Caffe

  • 源于Berkeley的主流CV工具包,支持C++、python、matlab
  • Model Zoo中有大量预训练好的模型供使用

PyTorch

  • Facebook用的卷积神经网络工具包
  • 通过时域卷积的本地接口,使用非常直观
  • 定义新网络层简单

TensorFlow

  • Google的深度学习框架
  • TensorBoard可视化很方便
  • 数据和模型并行化好,速度快

总结

  • 卷积神经网络CNN在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。
  • CNN一个非常重要的特点就是头重脚轻(越往输入权值越小,越往输出权值越多),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。
  • 卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

你可能感兴趣的:(神经网络学习笔记)