卷积神经网络

引言

在cv领域 通常我们需要做的就是使用计算程序来代替我们人眼对于图像来进行识别,那么深层神经网络在对于图像的识别上是有局限性的
如果有一张图片未28*28像素的黑白图片 那么我们总的数值个数就是 2352 个 设隐藏层的神经网络的数量是10个 那么我么就需要设置23520个权重参数
如果是一个彩色【三通道】的图片呢 ? 那么计算还需要乘3 这么大的参数计算起来会非常复杂,并且得到的结果也不会很好。
为此就引出了卷积神经网络的概念

前置知识

感受野

1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptive field)的概念,Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络。
单个感受器与许多感觉神经纤维相联系,感觉信息是通过许多感受神经纤维得到神经冲动。一个神经元所反应的刺激区域就叫做神经元的感受野(receptive field)
image.png
那么在cv 的领域 我们就有了一个概念叫感受野,用来表示网络内部不同位置的神经元对于原图像感受范围的大小。

边缘计算

那么边缘计算是一个什么概念呢 ?
定义: 为了能够使用更少的参数,检测出了更多的信息,基于上面感受野的思想,通常我们神经网络中需要检测出物体最为明显的垂直和水平边缘来区分物体
image.png
那么我们如何得到这些特征呢?
看一个列子,一个 6×6的图像卷积与一个3×3的过滤器(Filter or kenel)进行卷积运算(符号为 ), 也可能是矩阵乘法所以通常特别指定是卷积的时候代表卷积意思。
相当于将 Filter 放在Image 上,从左到右、从上到下地(默认一个像素)移动过整个Image,
分别计算 ImageImage 被 Filter 盖住的部分与 Filter的逐元素乘积的和
image.png
我们观察原图这一个66像素的图片,左边的值全部都是10 右边的值全部都是0 那么中间就是一个非常明显的,垂直边缘,而这个图像和过滤器的结果中,中间两列的值全部都是30 两边两列的值全部都是0 为此我们就检测到了6 6 像素中垂直边缘
image.png
tips: 这里看上去边缘比较粗但是最终结果看到的是两个像素的位置,如果是在一个500
500 的图中,那么看到的就是一个竖直的边缘了。
为此我们可以将过滤器中的数值作为参数,通过反向传播的方式来学习的到。这样我哦们算法可以根据实际的数据来选择合适的检测目标,无论是检测水平边缘,垂直边缘还是其他角度的边缘,都可以学习到图像的低层的特征。

组成

定义: 一个卷积神经网络是有一个 或者多个的卷积层,池化层以及全连接层区组成的。
image.png

卷积层

卷积层的运算目的就是提取不同的特征,而某一些的卷积层可能只提取一些低级的特征比如边缘,线条等层级,那么更多层的网路就可以从低级特征中提取出更加复杂的特征

  • 参数:

size: 卷积核/ 过滤器的大小 有1_1 , 3 _3 , 5 * 5 的选择
padding: 零填充,valid 以及 same
stride: 步长,通常默认是1

默认计算方法

  • 计算公式 【输入图片通过卷积核之后输出的图片】

image.png
下面动图可以更加直观的看出卷积计算的过程
卷积神经网络 - 图7
这一种默认的计算方式最后恒可能就变成了1*1 的大小,这个不是我们想要看到的结果,并且这样对于原始图片中的边缘像素来说只计算了一遍,而且对于中间像素会有很多次过滤器的计算,这样比边缘信息就会丢失

padding - 零填充的概念

定义: 在图片像素的最外层加上若干的0 值【填充0 是因为不会对于最后的运算结果照成影响】, 如果是一层就称为 P= 1
image.png
可是我们发现最终计算的结果比之前的图片大小还大
为此我们有一下两种选择

  • Vaild

这一种方式就是之前的不填充, 最终计算的结果就是 image.png

  • Same : 这一种方式将输出大小和原图片的大小一致 那么nn 就比那陈概率n+2pn+2p

计算公式: image.png
有一下结论: P = (F-1)/2 = > 因此我们只要知道了卷积核的大小就知道我们需要填充多少的像素 【所以这里卷积核的大小都是奇数的 因为计算的p 需要是整数】

步长 【stride】

如果我们移动的步长修改为2 那么计算出来的结果就会变成 这个样子
image.png
这样计算的公式也会变化 结果 N + 2P - F + 1 = 6 + 0 - 3 + 1 = 4
但是移动两个像素才得出一个结果 那么公式就是 (n + 2 p - F )/2 + 1 = 1.5 + 1 = 2.5
相除不是整数向下取整。由于这里就没有加上零填充 为此最终公式: image.png

多通道卷积

如果输入有多个通达的时候 【比如图片是有rgb三个通道】 那么卷积核就需要拥有相同的channel 的树,每一个卷积核channel 和输入层的对应channel 来进行卷积,将每一个channel 的卷积结果按位与相加得到了最终的feature map
image.png

多核卷积

我们有多个卷积核的时候,就可以学习到多个不同的特征,对应产生多个channel 的feature map , 比如这里有两个filter 所以output 就有两个channel 而这里多个卷和也可以理解为多少个神经元
image.png
相当于我们把多个功能的卷积核的计算结果放在一起,比如水平边缘检测和垂直边缘检测器。

案例计算

这里的bisa 是偏置 ,相当于多了一个参数。在增加网络少量拟合能力的情况下,bias和其它普通权值相比无论前向还是后向,计算上都要简单,因为只需要一次加法。同时,bias与其它权值的区别在于,其对于输出的影响与输入无关,能够使网络的输出进行整体地调整,算是另一维自由度吧。放在二维上,权值相当于直线的斜率,而bias相当于截距,这二者都是直线参数的一部分,并没有必要区别对待。
image.png
参数分析

image.png

池化层

这一个模块主要对于卷积学习到的特征图来进行亚采样 可以分为两种

  • 最大池化: max pooling 取窗口内的最大值来作为输入
  • 平均池化: avg pooling 取窗口内所有值的平均来作为输出

那么这样做的意义就是降低了后续网络层的输入维度,缩减了模型的大小,提高了计算的速度,提高了feature map 的鲁棒性,防止过度拟合

最大池化规则的案例
image.png
平均池化规则的案例
image.png

全连接层

卷积层+ 激活层 + 池化层 就可以看成是cnn 的特征学习/特征提取层,而学习到的特征(feature map ) 最终应用到了模型任务(分类,回归)
我们先对于所有的feature map 来进行了扁平化的操作 (fllatten 额就是reshape 成 1 * N 的向量) 让后再连接一个全连接层进行模型学习
image.png