1.CNN卷积神经网络

目录

1.1 卷积的定义

1.2 感受野

1.3 图像的卷积

1.4卷积核

1.4.1卷积核与滤波器

1.4.2特殊卷积与卷积核

1.5 CNN基本原理

1.5.1输入层(Input layer)

1.5.2卷积层(Convolution layer,CONV)

1.5.3激活/激励层

1.5.4池化层(Pooling)

1.5.5全连接层

 1.5.6输出层

1.6 CNN的发展

1.6.1 LeNet-5

1.6.2 AlexNet

1.6.3 VGG16

1.6.4 Inception Net

1.6.5 ResNet


1.1 卷积的定义

如果不是很理解,建议阅读一下这篇文章:如何通俗易懂地解释卷积? - 知乎 (zhihu.com)

卷积的定义:泛函分析中,卷积、旋积或褶积(英语:Convolution)是通过两个函数f和g生成第三个函数的一种数学运算,其本质是一种特殊的积分变换,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。

卷积的通用公式:

离散型:

(f*g)(n)=\sum_{\tau=-\infty}^{\infty}f(\tau)g(n-\tau)

连续型:

(f*g)(n)=\int_{-\infty}^{\infty}f(\tau)g(n-\tau)d\tau

卷积的抽象解释:

卷积是个抽象的概念,”卷“和”积“需要分开理解。”卷“有着翻转,回溯的含义;”积“可以理解为乘积,再进行乘积求和。这样的解释显然也是很抽象的,下面看三个例子,通过例子理解什么是卷积。

1.信号分析(连续)

如下图所示,输入连续信号f(t) ,是随时间变化的。系统响应函数是 g(t) ,图中的响应函数是随时间指数下降的,它的物理意义是说:如果在 t=0 的时刻有一个输入,那么随着时间的流逝,这个输入将不断衰减。换言之,到了 t=T时刻,原来在 t=0 时刻的输入f(0)的值将衰减为f(0)g(T)。但是在t=T时刻之前,信号是一直输出的,那么假设在T-\Deltat的时刻,那么相对于系统响应函数来说,T-\Deltat的时刻到T时刻,一共衰减了\Deltat,此时在T时刻衰减后的信号响应为f(T-\Deltat)g(\Deltat)。如果此时将 T时刻之前的响应累加起来就得到了连续型卷积的公式:

(f*g)(n)=\int_{0}^{T}f(\tau)g(T-\tau)d\tau

输入信号f(t):

系统响应g(t):

 

2.信号分析(离散)

对于离散的信号,卷积的过程与连续的是一样的。下面看一个离散信号的例子:

输入信号:

对于x[n]:已知x[0] = a, x[1] = b, x[2]=c

这里写图片描述

系统响应:

对于g[n]:已知g[0] = i, g[1] = j, g[2]=k

这里写图片描述

 如果按照上述连续型卷积原理分析:

  • 在T=0时刻的输出的信号为x[0]\astg[0]=ai;
  • 在T=1时刻的输出的信号为x[0]\astg[1]+ x[1]\astg[0]=aj+bi;
  • 在T=2时刻的输出的信号为x[0]\astg[2]+ x[1]\astg[1]+ x[2]\astg[0]=ak+bj+ci;
  • 在T=3时刻的输出的信号为x[0]\astg[3]+ x[1]\astg[2]+ x[2]\astg[1]+ x[3]\astg[0]=bk+cj;
  • 在T=4时刻的输出的信号为x[0]\astg[4]+ x[1]\astg[3]+ x[2]\astg[2]+ x[3]\astg[1]+ x[4]\astg[0]=ck;

显示在图上的信号输出:

这里写图片描述

 对于上面的信号输出问题,换一种做法:

将x[n]分别乘g[0] = i, g[1] = j, g[2]=k,代表在这些时刻处的信号输出。

第一步,x[n]乘以y[0]并平移到位置0,1,2:(代表这些时刻的信号在0时刻的输出):

这里写图片描述

第二步,x[n]乘以y[1]并平移到位置1,2,3:(代表这些时刻的信号在1时刻的输出):

这里写图片描述

 第三步,x[n]乘以y[2]并平移到位置2,3,4:(代表这些时刻的信号在2时刻的输出):

 这里写图片描述

 将三者累加求和:

这里写图片描述

3.求扔两个色子结果之和为4的概率

4.存款复利

 从上面的解释中,可以看出此处的”卷积“有着加权求和的含义。从上面的几个例子中,可以简单理解为(个人理解):

  1. 卷积不要刻板的理解为翻转乘积求和,加权求和等等方式
  2. 卷积可以看作在两个坐标系或者两个状态分支下去求解某个状态的输出
  3. 这两个状态分支之间存在着一种依存或是相互影响的关系
  4. 在信号输出方面存在的关系:信号和输出时间响应即 ”任意 T时刻\Deltat之前的时刻,在T时刻衰减后的信号响应为f(T-\Deltat)g(\Deltat)“。两者的自变量和为定值T。
  5. 在求扔两个色子结果之和为4的概率中:两个色子之间必须满足自变量之和为4。

通过上面几个理解结论中,似乎可以把卷积看作是两个存在依存关系的在某个状态的输出。依存关系中最简明的要点就是,两个函数的自变量之和为定值。

1.2 感受野

感受野(Receptive Field)是指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的:

卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小,即特征图上的一个点对应输入图上的区域:

更为详细可参考:彻底搞懂感受野的含义与计算 

感受野计算公式:

\begin{aligned}RF_i=(RF_{i+1}-1)\times s_i+K_i\end{aligned}

s_i第i层步长stride(卷积核移动步长),RF_i为输出相对于第i层图片的感受野,K_i为第i层的卷积核大小。

例如2个卷积层,第1层3x3卷积核,stride是2,第2层为2x2卷积核

  •  RF2=2
  •  RF1=(2-1)*2+3=5;即输出在输入图片上的感受野为5x5

抽象理解感受野:我们看上图中的Conv1层,对Conv2层的感受野为2,可以解释为上图Conv1中的一个黄框变为Conv2层中的一个元素点,就如同黄色箭头指示的那样。对于原始输入层Raw,由于第一层sride为2,对于conv1层来说,黄色框框是由Raw层在3*3卷积核下,以sride为2在红色方框的运动得到的,可以理解为Conv1在Raw上的感受野为3,Con2在Raw上的感受野为5.

感受野计算实例:

序号网络层类型卷积核尺寸步长
1Conv13×31
2Conv22×22
3Pool13×31
4Conv33×31
5Pool22×22
6Conv42×22

计算Conv4层输出结果的感受野:

  • RF6=2 ;
  • RF5=S5(RF6-1)+k5=2(2-1)+2=4 ;
  • RF4=S4(RF5-1)+k4=1(4-1)+3=6;
  • RF3=S3(RF4-1)+k3=1(6-1)+3=8 ;
  • RF2=S2(RF3-1)+k2=2(8-1)+2=16;
  • RF1=S1(RF2-1)+k1=1(16-1)+3=18;

对于Covn4层输出对原始图像的感受野为18

1.3 图像的卷积

数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。

首先图像可以使用而为的矩阵形式表达:(彩色图片则使用RGB三通道)

对图像的处理函数可称为卷积核或是算子(如平滑,或者边缘提取),也可以用一个g矩阵来表示,如:

g=\left[\begin{array}{ccc} b_{-1,-1} & b_{-1,0} & b_{-1,1} \\ b_{0,-1} & b_{0,0} & b_{0,1} \\ b_{1,-1} & b_{1,0} & b_{1,1} \end{array}\right]

对于平面图像问题,本身已经是二维函数:

f(x,y)=a_x,_y

g(x,y)=b_x,_y

按卷积的定义,二维离散形式的卷积公式应该是:

(f*g)(u,v)=\sum_i\sum_j f(i,j)g(u-i,v-j)=\sum_i\sum_j a_{i,j}b_{u-i,v-j}

从卷积定义来看,应该是在x和y两个方向去累加(对应上面离散公式中的i和j两个下标),而且是无界的,从负无穷到正无穷。可是,真实世界都是有界的。例如,上面列举的图像处理函数g实际上是个3x3的矩阵,意味着,在除了原点b_{0,0}附近以外,其它所有点的取值都为0。考虑到这个因素,上面的公式其实退化了,它只把坐标(u,v)附近的点选择出来做计算了。所以,真正的计算如下所示:(在原始图像矩阵中取出(u,v)处的矩阵:)

f=\left[\begin{array}{ccc} a_{u-1, v-1} & a_{u-1, v} & a_{u-1, v+1} \\ a_{u, v-1} & a_{u, v} & a_{u, v+1} \\ a_{u+1, v-1} & a_{u+1, v} & a_{u+1, v+1} \end{array}\right]

然后将图像处理矩阵翻转(这个翻转有点意思,可以有几种不同的理解,其效果是等效的:(1)先沿x轴翻转,再沿y轴翻转;(2)先沿x轴翻转,再沿y轴翻转;),如下:

(1)先沿x轴翻转,再沿y轴翻转

(2)先沿y轴翻转,再沿x轴翻转

(3)其实还可以理解为顺时针或逆时针旋转180度。

 计算卷积时,就可以用 f 和 g′ 的内积:

\begin{array}{l}f*g(u,v)=a_{u-1,v-1}\times b_{1,1}+a_{u-1,v}\times b_{1,0}+a_{u-1,v+1}\times b_{1,-1}\\ \\ +a_{u,v-1}\times b_{0,1}+a_{u,v}\times b_{0,0}+a_{u,v+1}\times b_{0,-1}\\ \\ +a_{u+1,v-1}\times b_{-1,1}+a_{u+1,v}\times b_{-1,0}+a_{u+1,v+1}\times b_{-1,-1}\end{array}

以上公式有一个特点,做乘法的两个对应变量a,b的下标之和都是(u,v),其目的是对这种加权求和进行一种约束。这也是为什么要将矩阵g进行翻转的原因。以上矩阵下标之所以那么写,并且进行了翻转,是为了让大家更清楚地看到跟卷积的关系。这样做的好处是便于推广,也便于理解其物理意义。实际在计算的时候,都是用翻转以后的矩阵,直接求矩阵内积就可以了。

以上计算的是(u,v)处的卷积,延x轴或者y轴滑动,就可以求出图像中各个位置的卷积,其输出结果是处理以后的图像(即经过平滑、边缘提取等各种处理的图像)。

图像卷积的意义:卷积就是把原始图像中的相邻像素都考虑进来,进行混合。相邻的区域范围取决于g矩阵的维度,维度越大,涉及的周边像素越多。亦可以说是把卷积中心点的周围像素作为相关特征和中心点联系起来。而矩阵的设计,则决定了这种混合输出的图像跟原始图像比,究竟是模糊了,还是更锐利了。

1.4卷积核

1.4.1卷积核与滤波器

在看论文的时候,卷积操作时,往往会出现卷积核(kernels)与滤波器(filters)两个概念,很多人会将二者混为一谈,这是不正确的。

卷积核:二维的矩阵

滤波器:多个卷积核组成的三维矩阵,多出的一维是通道。(其实可以理解为张量,不一定要理解为三位矩阵)

介绍一些术语:layers(层)、channels(通道)、feature maps(特征图),filters(滤波器),kernels(卷积核)。从层次结构的角度来看,层和滤波器的概念处于同一水平,而通道和卷积核在下一级结构中。通道和特征图是同一个事情。一层可以有多个通道(或者说特征图)。如果输入的是一个RGB图像,那么就会有3个通道。“channel”通常被用来描述“layer”的结构。相似的,“kernel”是被用来描述“filter”的结构。

layer和channel之间,filter和kernel之间的不同:

 filter和kernel之间的不同很微妙。很多时候,它们可以互换,所以这可能造成我们的混淆。那它们之间的不同在于哪里呢?一个“Kernel”更倾向于是2D的权重矩阵。而“filter”则是指多个Kernel堆叠的3D结构。如果是一个2D的filter,那么两者就是一样的。但是一个3Dfilter,在大多数深度学习的卷积中,它是包含kernel的。每个卷积核都是独一无二的,主要在于强调输入通道的不同方面。

多通道卷积:将每个内核应用到前一层的输入通道上以生成一个输出通道。这是一个卷积核过程,我们为所有Kernel重复这样的过程以生成多个通道。然后把这些通道加在一起形成单个输出通道。下图:(输入是一个5x5x3的矩阵,有三个通道。filter是一个3x3x3的矩阵。首先,filter中的每个卷积核分别应用于输入层中的三个通道。执行三次卷积,产生3个3x3的通道。)

然后,这三个通道相加(矩阵加法),得到一个3x3x1的单通道。这个通道就是在输入层(5x5x3矩阵)应用filter(3x3x3矩阵)的结果。

同样的,我们可以把这个过程看作是一个3Dfilter矩阵滑过输入层。值得注意的是,输入层和filter有相同的深度(通道数量=卷积核数量)。3Dfilter只需要在2维方向上移动,图像的高和宽。这也是为什么这种操作被称为2D卷积,尽管是使用的3D滤波器来处理3D数据。在每一个滑动位置,我们执行卷积,得到一个数字。就像下面的例子中体现的,滑动水平的5个位置和垂直的5个位置进行。总之,我们得到了一个单一通道输出。

如何在不同深度的层之间转换。假设输入层有Din个通道,我们想得到输出有Dout个通道。我们只需要将Dout filters应用到输入层。每一个 filter有Din个卷积核。每个filter提供一个输出通道。完成该过程,将结果堆叠在一起形成输出层。(下图中,Din个通道存在Din个卷积核,Din个卷积核构成了一个filter,就是下图中的黄色立方体,再有Dout个filters卷积输出绿色图像

但是在深度学习中,我们仍然把上述操作称为2D卷积。3D数据,2D卷积。滤波器的深度和输入层的深度是一样的。3D滤波器只在两个方向上移动(图像的高和宽),而输出也是一个2D的图像(仅有一个通道)。

3D卷积是存在的,它们是2D卷积的推广。在3D卷积中,滤波器的深度小于输入层的深度(也可以说卷积核尺寸小于通道尺寸)。所以,3D滤波器需要在数据的三个维度上移动(图像的长、宽、高)。在滤波器移动的每个位置,执行一次卷积,得到一个数字。当滤波器滑过整个3D空间,输出的结果也是一个3D的。和2D卷积能够编码2D域中的对象关系一样,3D卷积也可以描述3D空间中的对象关系。3D关系在一些应用中是很重要的,比如3D分割/医学图像重构等。

下面以一个1x1卷积展示多通道卷积,它具有以下三个优点:

  • 降维以实现高效计算

  • 高效的低维嵌入特征池

  • 卷积后再次应用非线性

从上面的图不难看出,对于D通道的图像进行卷积,需要D个卷积核。这D个卷积核构成了滤波器,最后输出在一个通道的图像中。为了使用卷积实现此目标,我们使用了称为转置卷积或反卷积(它并不是真正的“逆转”卷积运算)的卷积修改版。下面的GIF中的虚线块表示padding。

1.4.2特殊卷积与卷积核

转置卷积:有时我们需要对输入进行如增加尺寸(也称为“上采样”)等处理。转置卷积是相对正常卷积的相反操作,但它只恢复尺寸,因为卷积是一个不可逆操作。

 空间可分离卷积(separable convolution:

在一个可分离卷积中,我们可以将内核操作拆分成多个步骤。我们用y = conv(x,k)表示卷积,其中y是输出图像,x是输入图像,k是内核。这一步很简单。接下来,我们假设k可以由下面这个等式计算得出:k = k1.dot(k2)。这将使它成为一个可分离的卷积,因为我们可以通过对k1和k2做2个一维卷积来取得相同的结果,而不是用k做二维卷积。

以通常用于图像处理的Sobel内核为例。你可以通过乘以向量[1,0,-1]和[1,2,1] .T获得相同的内核。在执行相同的操作时,你只需要6个而不是9个参数。(如下所示)

\left[\begin{array}{lll} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{array}\right]=\left[\begin{array}{l} 1 \\ 2 \\ 1 \end{array}\right] \times\left[\begin{array}{lll} -1 & 0 & 1 \end{array}\right]

扩张卷积(空洞卷积 Dilated Convolutions):
扩张卷积引入另一个卷积层的参数被称为扩张率。这定义了内核中值之间的间距。扩张速率为2的3x3内核将具有与5x5内核相同的视野,而只使用9个参数。 想象一下,使用5x5内核并删除每个间隔的行和列。(如下图所示)

深度可分离卷积(depthwise separable convolution):

感谢供图:Kernel (image processing) - Wikipedia

先看一张待处理的原图:

均值滤波(盒模糊(Box blur)):

均值滤波器从名字就可以看出,每个元素值都一样,是卷积核元素个数的倒数,这样每个输出像素就是其周围像素的均值。一个3 × 3 的均值滤波器如下所示:
\frac{1}{9}\begin{bmatrix}1&1&1\\ 1&1&1\\ 1&1&1\end{bmatrix}

滤波后的结果:

identity 恒等卷积核:

在identity卷积核中,只有中心[2, 2]位置处的权重为 1,其余均为 0,所以在进行卷积运算加权后时,像素只与自己本身位置进行了运算,最后返回的还是原像素的值,所以图像处理后是不变的。(这里也反映了卷积的含义,为什么卷积核的维度大多为奇数,反映了中心点元素与周围元素的特征权重关系)

\begin{bmatrix}0&0&0\\ 0&1&0\\ 0&0&0\end{bmatrix}

滤波后的结果:

 

膨胀卷积:

膨胀后的卷积核尺寸 = 膨胀系数 × (原始卷积核尺寸-1)+ 1

例如对于输入是19 x 19(暂且不考虑图像通道数)大小的图像做膨胀卷积,要使输出的图像大小保持不变,即就是仍然为19 x 19,我们要怎样实现呢?

我们的代码是基于pytorch实现的,它的卷积参数中没有padding='SAME‘的选项,padding的可取值为0,1,2,3等等的值。它的计算方式和tensorflow中的padding='VALID'的计算方式一样。

Output=(W-F+2P)/S+1

我们取strides=1,这里的原始卷积核为3 x 3大小,dilation=6,我们可以计算出膨胀后的卷积核大小为6(3-1)+1=13

带入公式可以求得:

(19-13+2*p)/1+1=19,要使这个式子成立,可以反推出padding=6。

这样一来,就可以使得输入输出的尺寸保持不变。达到了我们想要的效果。

 高斯模糊(Gaussian blur):

高斯卷积核依赖的是高斯函数,所以卷积核的值是围绕着中心点分布的,离中心点越近,贡献也就越大,所以权重值就越高,如下为二维区域高斯曲线图:

 首先列出一个3×3的高斯模糊卷积核,中心点权重为4,离得最近的上下左右的权重都是 2,稍远一点的对角位置贡献的权重都是1,最后除以权重和16,矩阵和效果如下所示:

\dfrac{1}{16}\begin{bmatrix}1&2&1\\ 2&4&2\\ 1&2&1\end{bmatrix}

滤波后的结果:

 再列出 5×5 的高斯模糊卷积核,和 3×3 类似,以中心点画圆,离圆心越远权重越小,最后除以权重和 256,矩阵和效果图如下:(与 3×3 的高斯模糊对比,由于距离中心点更远的位置也贡献了权重,所以 5×5 要更模糊一些。)

\dfrac{1}{256}\begin{bmatrix}1&4&6&4&1\\ 4&16&24&16&4\\ 6&24&36&24&6\\ 4&16&24&16&4\\ 1&4&6&4&1\end{bmatrix}

 锐化(Sharpen):

锐化的本质还是利用的边缘检测的原理,放大[2, 2]位置与周围元素的权重的区别。与边缘检测权重和为 0 相比,锐化卷积核中所有权重加起来后的值为 1。当权重和大于 1 时,会整体使图片变亮,小于 1 会变暗,等于 1 就会保留原始亮度,所以锐化卷积核保留了原始图形的亮度,而上述的三个边缘检测核使图像变暗。

\begin{bmatrix}0&-1&0\\ -1&5&-1\\ 0&-1&0\end{bmatrix}

滤波后的结果:

边缘检测(Edge detection):

edge detction(边缘检测)对图像识别中的特征提取是非常有作用的,边缘检测卷积核都有一个共同点,就是能够突出图片矩阵中变化剧烈的位置。矩阵如下所示,三种边缘检测核的效果是越来越明显,主要原因就是加强了卷积核中[2, 2]位置处与周围元素的区别,图片中变化剧烈位置的在加权后,数值大的更大,数值小的更小,形成了边缘检测效果。

第一个核中的权重左上往右下都是 1、0、1,而右上往左下是-1、0、-1,在进行卷积运算时,对角方向的边缘更容易识别出来;

\begin{bmatrix}1&0&-1\\ 0&0&0\\ -1&0&1\end{bmatrix}

滤波后的结果:

第二个核中,权重从左往右是 1、-4、1,从上往下也是 1、-4、1,所以水平和垂直方向的边缘更容易识别出来;

\begin{bmatrix}0&1&0\\ 1&-4&1\\ 0&1&0\end{bmatrix}

滤波后的结果:

第三个核中权重水平垂直和对角都是-1、8、-1,所以水平和倾斜的边缘都容易识别。

\begin{bmatrix}-1&-1&-1\\ -1&8&-1\\ -1&-1&-1\end{bmatrix}

滤波后的结果:

反锐化掩膜(Unsharp masking):

反锐化掩膜与5 阶高斯模糊的卷积核,所有位置都取相反数,中间位置取值 476(-36+256+256),其实还是达到一种锐化的效果,卷积核如下所示:

-\dfrac{1}{256}\begin{bmatrix}1&4&6&4&1\\ 4&16&24&16&4\\ 6&24&-476&24&6\\ 4&16&24&16&4\\ 1&4&6&4&1\end{bmatrix}

  • 第一步:正常的原始信号,在本文中也就是原始图像矩阵。
  • 第二步:进行模糊处理,本文中进行 5 阶高斯模糊。
  • 第三步:使用原始信号减去模糊后的信号,取得差值,本文中就是 36。
  • 第四步:给原始信号反向加上差值,本文中就是-36+256+256,完成了对原始图像的锐化。

 Prewitt算子:

计算水平梯度,检测垂直边缘:

\begin{bmatrix}-1&0&1\\ -1&0&1\\ -1&0&1\end{bmatrix}
计算垂直梯度,检测水平边缘:

\begin{bmatrix}-1&-1&-1\\ 0&0&0\\ 1&1&1\end{bmatrix}

Sobel算子:Sobel更强调了和边缘相邻的像素点对边缘的影响。相比较Prewitt算子,Sobel模板能够较好的抑制噪声(平滑)效果。

计算水平梯度,检测垂直边缘:

\begin{bmatrix}-1&0&1\\ -2&0&2\\ -1&0&1\end{bmatrix}
计算垂直梯度,检测水平边缘:

\begin{bmatrix}-1&-2&-1\\ 0&0&0\\ 1&2&1\end{bmatrix}

Laplacian算子:Sobel和Prewitt都是通过求一阶导数来计算梯度的,用于线的检测,通常用于边缘检测。在图像处理过程中,除了检测线,有时候也需要检测特殊点,这就需要用二阶导数进行检测,著名的就是拉普拉斯(Laplacian)算子。对图像求两次导数,公式如下:

\begin{aligned} & \nabla^2 f(x, y)=\frac{\partial^2 f}{\partial x^2}+\frac{\partial^2 f}{\partial y^2} \\ & =\{f(x+1, y)+f(x-1, y)-2 f(x, y)\}+\{f(x, y+1)+f(x, y-1)-2 f(x, y)\} \\ & =f(x+1, y)+f(x-1, y)+f(x, y+1)+f(x, y-1)-4 f(x, y) \end{aligned}

所以拉普拉斯算子为:

\begin{bmatrix}0&1&0\\ 1&-4&1\\ 0&1&0\end{bmatrix}\quad\text{or}\quad\begin{bmatrix}0&-1&0\\ -1&4&-1\\ 0&-1&0\end{bmatrix}

下面这个拉普拉斯算子提取边缘更明显:

\begin{bmatrix}1&1&1\\ 1&-8&1\\ 1&1&1\end{bmatrix}\quad\text{or}\quad\begin{bmatrix}-1&-1&-1\\ -1&8&-1\\ -1&-1&-1\end{bmatrix}

拉普拉斯算子在边缘检测的应用中并不局限于水平方向或垂直方向,这是Laplacian与soble的区别。因为一阶二阶导数都能放大孤立点和孤立线(噪声)的影响,所以如果存在噪声,那么一阶二阶导数处理过后的图像将会有更多更大的噪声。所以对图像进行一阶二阶导数运算之前需要先对图像做平滑去噪处理。

1.5 CNN基本原理

1.5.1输入层(Input layer)

通常在这一层对传入数据进行处理,此步骤可大幅优化图像处理结果,有效防止输入不同的数据单位,显著缩短神经网络训练耗时,提高网络收敛速率;需要引起注意的是,神经网络的激活函数一般都处于一定的数值区间,因此进行网络训练的数据得映射到相应的区间。(对于去均值的操作,BN可以代替)

  • 数据增强(数据增强,裁剪、翻转、光照等等,提高模型泛化能力
  • 归一化(输入图片尺寸固定等)
  • PCA/SVD降维等

1.5.2卷积层(Convolution layer,CONV)

卷积层的主要作用是对输入图像进行卷积运算和特征提取。卷积层中含有一系列具有同一大小的卷积核,不同的卷积核对特征提取有不同的作用。

卷积层由一组滤波器组成,滤波器为三维结构,其深度由输入数据的深度决定,一个滤波器可以看作由多个卷积核堆叠形成。这些滤波器在输入数据上滑动做卷积运算,从输入数据中提取特征。在训练时,滤波器上的权重使用随机值进行初始化,并根据训练集进行学习,逐步优化。

卷积核:

上面已经介绍了卷积核的一部分含义,这里只介绍卷积核在卷积层的作用。

  • 卷积层的深度(卷积核个数)

一个卷积层通常包含多个尺寸一致的卷积核,如下图所示,卷积层的深度为3:(由于此处为单通道,所以三个卷积核相当于三个滤波器,以及存在三个神经元。三个滤波器决定了三个神经元,输出了三个featch map)

偏置:就是每个元素加上一个偏置bias值

在这里插入图片描述

局部感知:

CNN并不是所有上下层神经元都能直接相连,而是通过“卷积核”作为中介。同一个卷积核在所有图像内都是共享的,图像通过卷积操作后仍然保留原来的位置关系。

复合多个“卷积层”和“采样层”对输入信号进行加工,然后再连接层实现与输出目标之间的映射。多层的目的:一层卷积学到的特征往往是局部的,层数越高,学到的特征就越全局化。

一般认为图像的空间联系是局部的像素联系比较密切,而距离较远的像素相关性较弱,因此,每个神经元没必要对全局图像进行感知,只要对局部进行感知,然后在更高层将局部的信息综合起来得到全局信息。利用卷积层实现:(特征映射,每个特征映射是一个神经元阵列):从上一层通过局部卷积滤波器提取局部特征。卷积层紧跟着一个用来求局部平均与二次提取的计算层,这种二次特征提取结构减少了特征分辨率。即网络部分连通,每个神经元只与上一层的部分神经元相连,只感知局部,而不是整幅图像。

参数共享:卷积核(共享权重)

filter共享权重和共享偏置(统称共享权值)

在局部连接中,每个神经元的参数都是一样的,即:同一个卷积核在图像中都是共享的。(理解:卷积操作实际是在提取一个个局部信息,而局部信息的一些统计特性和其他部分是一样的,也就意味着这部分学到的特征也可以用到另一部分上。所以对图像上的所有位置,都能使用同样的学习特征。)卷积核共享有个问题:提取特征不充分,可以通过增加多个卷积核来弥补,可以学习多种特征。
对于一个100x100像素的图像,如果我们用一个神经元来对图像进行操作,这个神经元大小就是100x100=10000,但如果我们使用10x10的卷积核,我们虽然需要计算多次,但我们需要的参数只有10x10=100个,加上一个偏置bias,一共只需要101个参数。我们取得图像大小还是100x100。

如果我们取得图像比较大,它的参数将会更加多。我们通过10x10的卷积核对图像进行特征提取,这样我们就得到一个Feature Map。

一个卷积核只能提取一个特征,所以我们需要多几个卷积核,假设我们有6个卷积核,我们就会得到6个Feature Map,将这6个Feature Map组成一起就是一个神经元。这6个Feature Map我们需要101*6=606个参数。这个值和10000比还是比较小的。

填充/填白(Padding):

在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),使用填充的目的是调整输出的尺寸,使输出维度和输入维度一致;如果不调整尺寸,经过很多层卷积之后,输出尺寸会变的很小。所以,为了减少卷积操作导致的,边缘信息丢失,我们就需要进行填充(Padding)。

下图是2D卷积,Kernel size=3,Stride=1,Padding=1:

Stride(步长/步幅):

增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。 如果将这样的关系写成算式,会如何呢?接下来,我们看一下对于填充和步幅,如何计算输出大小。

假设输入大小为(H, W),滤波器大小为(FH, FW),输出大小为 (OH, OW),填充为P,步幅为S。此时,输出大小可通过下面的式子进行计算。

\begin{array}{l}OH=\dfrac{H+2P-FH}{S}+1\\ \\OW=\dfrac{W+2P-FW}{S}+1\end{array}

以上面步幅为2的卷积为例:
输入大小:(7, 7);填充:0;步幅:2;滤波器大小:(3, 3)

\begin{array}{l}OH=\dfrac{7+2\cdot0-3}{2}+1=3\\\\ OW=\dfrac{7+2\cdot0-3}{2}+1=3\end{array}

特征图:

浅层卷积层:提取的是图像基本特征,如边缘、方向和纹理等特征 。

深层卷积层:提取的是图像高阶特征,出现了高层语义模式, 如 “车轮”、“人脸”等特征

三通道卷积示意图:

  RGB彩图卷积过程_rgb卷积

1.5.3激活/激励层

在CNN中,卷积操作只是加权求和的线性操作,若神经网络只用卷积层,那么无论有多少层,输出都是输入的线性组合,网络的表达能力有限,无法学习到非线性函数。因此CNN引入激励函数,激活函数是个非线性函数,常作用于卷积层和全连接层输出的每个神经元(分量/元素),给神经元引入了非线性因素,使网络的表达能力更强,几乎可逼近任意函数,这样神经网络就可应用到众多的非线性模型中。

下面是几个常见的激活函数:

激活函数的使用方式:

 卷积神经网络中最常用的是ReLU,Sigmoid使用较少。计算速度快,ReLU函数只有线性关系,比Sigmoid和Tanh要快很多。输入为正数的时候,不存在梯度消失问题。

强制性把负值置为0,可能丢掉一些特征。

当输入为负数时,权重无法更新,导致“神经元死亡”(学习率不 要太大)

如果ReLU失效,考虑使用Leaky ReLU、PReLU、ELU或 者Maxout,此时一般情况都可以解决

1.5.4池化层(Pooling)

也称为欠采样下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。主要有:最大池化(max-pooling)和均值池化(average-pooling)

池化层不包含需要训练学习的参数,仅需指定池化操作的 核大小、操作步幅以及池化类型。

 池化的作用:

  • 减少网络中的参数计算量,从而遏制过拟合 
  • 增强网络对输入图像中的小变形、扭曲、平移的鲁棒性(输入里的微 小扭曲不会改变池化输出——因为我们在局部邻域已经取了最大值/ 平均值) 
  • 帮助我们获得不因尺寸而改变的等效图片表征。这非常有用,因为 这样我们就可以探测到图片里的物体,不管它在哪个位置

1.5.5全连接层

全连接层(Full Connected Layer)就是一个线性特征映射的过程,将多维的特征输入映射为二维的特征输出,高维表示样本批次,低维常常对应任务目标(例如分类就对应每一个类别的概率)。全连接层主要对特征进行重新拟合,减少特征信息的丢失;

  • 对卷积层和池化层输出的特征 图(二维)进行降维 
  • 将学到的特征表示映射到样本 标记空间的作用

 1.5.6输出层

对于分类问题:使用Softmax函数:

y_i=\frac{e^{z_i}}{\sum_{i=1}^n e^{z_i}}
对于回归问题:使用线性函数:

y_l=\sum\limits_{m=1}^{M}w_{im}x_m

1.6 CNN的发展

1.6.1 LeNet-5

LeNet-5由LeCun等人提出于1998年提出,是一种用于手写体字符识别的非常高效的卷积神经网络。出自论文《Gradient-Based Learning Applied to Document Recognition》,主要进行
手写数字识别和英文字母识别。

ff7818be02f52eb088b1b114f664cf2b.png

输入层:32*32的图片,也就是相当于1024个神经元,通道为1

C1层(卷积层):使用 6 个 5×5 大小的卷积核,padding=0,stride=1进行卷积,得到 6 个 28×28 大小的特征图:(计算卷积后图像大小32-5+1=28)

fb37e381b3a8fffa509089e3506e3147.png

参数个数为:(5*5+1)*6=156,其中5*5为卷积核的25个参数w,1为偏置项b。

连接数:56*28*28=122304,其中156为单次卷积过程连线数,28*28为输出特征层,每一个像素都由前面卷积得到,即总共经历28*28次卷积。

S2 层(下采样层):使用 6 个 2×2 大小的卷积核进行池化,padding=0,stride=2,得到 6 个 14×14 大小的特征图:28/2=14。

716bd9306e183202277b1373af1486d8.png

S2 层其实相当于降采样层+激活层。先是降采样,然后激活函数 sigmoid 非线性输出。先对 C1 层 2x2 的视野求和,然后进入激活函数,即:

sig mod(w\cdot\sum\limits_{i=1}^{4}x_i+b)

参数个数:(1+1)*6=12,其中第一个 1 为池化对应的 2*2 感受野中最大的那个数的权重 w,6为卷积核个数第二个 1 为偏置 b。(公式中只有最大的哪个数有权重为1)

连接数:(2*2+1)*6*14*14= 5880,虽然只选取 2*2 感受野之和,但也存在 2*2 的连接数,1 为偏置项的连接,14*14 为输出特征层,每一个像素都由前面卷积得到,即总共经历 14*14 次卷积。

C3层(卷积层):C3 层是卷积层,使用 16 个 5×5xn 大小的滤波器,padding=0,stride=1 进行卷积,得到 16 个 10×10 大小的特征图:14-5+1=10。实际需要的参数个数为 1516 个

重要:由于当时算力的限制并不是使用了16个5*5*6大小的滤波器进行卷积操作,如下图所示,C3 的前六个特征图(0,1,2,3,4,5)由 S2 的相邻三个特征图作为输入,对应的卷积核尺寸为:5x5x3;接下来的 6 个特征图(6,7,8,9,10,11)由 S2 的相邻四个特征图作为输入对应的卷积核尺寸为:5x5x4;接下来的 3 个特征图(12,13,14)号特征图由 S2 间断的四个特征图作为输入对应的卷积核尺寸为:5x5x4;最后的 15 号特征图由 S2 全部(6 个)特征图作为输入,对应的卷积核尺寸为:5x5x6。

可能上面的解释还是有点蒙蔽的话,你可以理解为C3的0特征图由012卷积输出,1特征图由123卷积输出,上图中的横坐标表示输出的特征图。每个输出的特征图由所在列的前一层输入卷积得到。

7f3df376b6f0ba12ed66e6078401f5b7.png

 参数个数:(5*5*3+1)*6+(5*5*4+1)*6+(5*5*4+1)*3+(5*5*6+1)*1=1516。(卷积核和一个偏置)

连接个数:1516*10*10 = 151600。10*10为输出特征层,每一个像素都由前面卷积得到,即总共经历10*10次卷积。

S4层(下采样层):

S4 层与 S2 一样也是降采样层,使用 16 个 2×2 大小的卷积核进行池化,padding=0,stride=2,得到 16 个 5×5 大小的特征图:10/2=5。(这里有个问题,后面的alexnet会解决,池化之间没有重叠,会损失一部分特征信息,每次池化的边界的联系被消除)的特征图。神经元个数已经减少为: 16*5*5=400

参数个数:(1+1)*16=32。

连接数:(2*2+1)*16*5*5= 2000。

C5层(卷积层):

C5 层是卷积层,使用 120 个 5×5x16 大小的卷积核,padding=0,stride=1进行卷积,得到 120 个 1×1 大小的特征图:(5-5+1=1卷积输出图像尺寸)。即相当于 120 个神经元的全连接层。值得注意的是,与C3层不同,这里120个卷积核都与S4的16个通道层进行卷积操作。神经元个数为120个。

参数个数:(5*5*16+1)*120=48120。

连接数:48120*1*1=48120。

F6层(全连接层):

F6 是全连接层,共有 84 个神经元,与 C5 层进行全连接,即每个神经元都与 C5 层的 120 个特征图相连。计算输入向量和权重向量之间的点积,再加上一个偏置,结果通过 sigmoid 函数输出。

F6 层有 84 个节点,对应于一个 7x12 的比特图,-1 表示白色,1 表示黑色,这样每个符号的比特图的黑白色就对应于一个编码。该层的训练参数和连接数是(120 + 1)x84=10164。ASCII 编码图如下:

2e4df01adfee421e60b70a4986fc060b.png

参数个数:(120+1)*84=10164。

连接数:(120+1)*84=10164。

 输出层:

最后的 Output 层也是全连接层,是 Gaussian Connections,采用了 RBF 函数(即径向欧式距离函数),计算输入向量和参数向量之间的欧式距离(目前已经被Softmax 取代)。

Output 层共有 10 个节点,分别代表数字 0 到 9。假设x是上一层的输入,y 是 RBF的输出,则 RBF 输出的计算方式是:

y_i=\sum\limits_{j=0}^{83}(x_j-w_{ij})^2

上式中 i 取值从 0 到 9,j 取值从 0 到 7*12-1,w 为参数。RBF 输出的值越接近于 0,则越接近于 i,即越接近于 i 的 ASCII 编码图,表示当前网络输入的识别结果是字符 i。

下图是数字 3 的识别过程:

b2090927f8d7dfd50af5be65c6fe6878.png

参数个数:84*10=840。

连接数:84*10=840。

1.6.2 AlexNet

  • 首次成功应用ReLU 作为 CNN 的激活函数
  • 使用Dropout 丢弃部分神元,避免了过拟合
  • 使用重叠 MaxPooling 让池化层的步长小于池化核的大小一定程度上提升了特征的丰富性
  • 使用CUDA 加速训练过程
  • 进行数据增强 ,原始图像大小为 256 × 256 的原始图像中重复截取 224 × 224 大小的区域,大幅增加了数据量,大大减轻了过拟合,提升了模型的泛化能力72
  • 与原始的LeNet相比,AlexNet网络结构更深,LeNet为5层,AlexNet为8层。在随后的神经网络发展过程中,AlexNet逐渐让研究人员认识到网络深度对性能的巨大影响。当然,这种思考的重要节点出现在VGG网络(下文中将会讲到),但是很显然从AlexNet为起点就已经开始了这项工作。
  • 关于LRNAlexNet 中的 LRN(Local Response Normalization) 是什么 - 知乎 (zhihu.com)对于替代者BN Batch-normalized 应该放在非线性激活层的前面还是后面? - 知乎 (zhihu.com)

AlexNet可分为8层(池化层未单独算作一层,包含在卷积层),包括5个卷积层以及3个全连接层

 

输入层:AlexNet首先使用大小为 224 × 224 × 3 图像作为输入,后改为227 × 227 × 3

第一层(卷积层):包含96个大小为11×11的滤波器(其实是11×11×3),卷积步长为4,因此第一层输出大小为55×55×96;使用Relu激活函数输出;再经过LRN输出(后面被BN替代);然构建一个核大小为3×3、步长为2的最大池化层进行数据降采样,进而输出大小为27×27×96

第二层(卷积层):包含256个大小为5×5滤波器,卷积步长为1,同时利用padding保证输出尺寸不变,因此该层输出大小为27×27×256;使用Relu激活函数输出;再经过LRN输出(后面被BN替代);然后再次通过核大小为3×3、步长为2的最大池化层进行数据降采样,进而输出大小为13×13×256

从第二层卷积开始,原始论文沿着通道数一分为二,分成2 个55x55x48 的张量,后续对 2 个张量进行卷积我们后续按照实际中更常用的方式计算卷积结果。(还是由于算力不够的原因)

第三层与第四层(卷积层):均为卷积核大小为3×3、步长为1的same卷积padding为1,如下面的计算公式),共包含384个卷积核,卷积后使用Relu激活函数输出;因此两层的输出大小为13×13×384,还可以反卷积o=si+k-2p-s 

\begin{array}{l}OH=\dfrac{H+2P-FH}{S}+1\\ \\OW=\dfrac{W+2P-FW}{S}+1\end{array}

13=\frac{13+2\times 1-3}{1}+1=13

第五层(卷积层):同样为卷积核大小为3×3、步长为1的same卷积,但包含256个卷积核,进而输出大小为13×13×256;在数据进入全连接层之前再次通过一个核大小为3×3、步长为2的最大池化层进行数据降采样,数据大小降为6×6×256,并将数据扁平化处理展开为9216个单元。

第六层、第七层和第八层(全连接层):全连接加上Softmax分类器输出1000类的分类结果,将近6千万个参数。

1.6.3 VGG16

  • 获得ImageNet LSVRC 2014 亚军
  • 比较常用的是VGG 16 ,结构规整,具有很强的拓展性
  • 相较于AlexNet VGG 16 网络模型中的卷积层均使用 3*3 的卷积核,且均为步长为 1 的 same 卷积,池化层均使用 2*2 的池化核,步长为 2

 

  • 两个卷积核大小为3*3 的卷积层串联后的感受野尺寸为 5*5相当于单个卷积核大小为 5*5 的卷积层
  • 两者参数数量比值为(2*3*3)/(5*5)=72% ,前者参数量更少
  • 此外,两个的卷积层串联可使用两次ReLU 激活函数,而一个卷积层只使用一次

1.6.4 Inception Net

  • Google公司 2014 年提出获得ImageNet LSVRC 2014 冠军
  • 文章提出获得高质量模型最保险的做法就是增加模型的深度(层数)或者是其宽度(层核或者神经元数 ),采用了 22 层网络
  • 深度:层数更深,采用了22 层,在不同深度处增加了两个loss 来避免上述提到的梯度消失问题
  • 宽度:Inception Module 包含 4 个分支,在卷积核 3x3 、 5x5之前、 max pooling 之后分别加上了 1x1 的卷积核,起到了降低特征图厚度的作用
  • 1× 1 的卷积的作用:可以跨通道组织信息,来提高网络的表达能力可以对输出通道进行升
    维和降维;

 

这里为了解决梯度消失问题,每隔一段距离做一个损失函数,参数量巨大。 

1.6.5 ResNet

ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。

  • 随着卷积网络层数的增加,误差的逆传播过程中存在的梯度消失和梯度爆炸问题同样也会导致模型的训练难以进行
  • 甚至会出现随着网络深度的加深,模型在训练集上的训练误差会出现先降低再升高的现象
  • 残差网络的引入则有助于解决梯度消失和梯度爆炸问题

ResNet的核心是叫做残差块(Residual block)的小单元,残差块可以视作在标准神经网络基础上加入了跳跃连接(Skip connection)

参考:这可能是神经网络 LeNet-5 最详细的解释了!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值