卷积神经网络

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积神经网络相关的知识,希望对你有一定的参考价值。

卷积神经网络

 


卷积神经网络全貌

神经网络在理论上,可以用来学习识别一切图像。

你只要把一张张的图片喂给神经网络,告诉它图上有什么,它终将自己发现各个东西的像素规律……但是在实践上,这个方法非常不可行。

一张 64*64 的彩色图片就要用 1 万个数来描述,如果想让反向传播神经网络识别这样的图,那第一层每一个神经元都得有 1 万个权重w。

神经网络中的参数越多,所需要的训练素材就越多,否则就会过拟合。并不是任何照片都能用作训练素材,你必须事先靠人工标记照片上都有什么东西作为标准答案,才能给神经网络提供有效反馈。这么多训练素材上哪找呢?

即使你有海量的数据,可同时计算海量的参数,对算力的要求也非常高。

后来有人提出了卷积神经网络,其实就是借鉴人识别物品的方法。

人脑并不是每次都把一张图中所有的像素都放在一起考虑。

我们会有看什么和往哪看的过程:

  • 看什么:让你找猫,你会先大概想象一下猫是什么样子,当你想象猫的时候,虽然不能完全说清,但你毕竟还是按照一定的规律去找。比如猫身上有毛,它有两个眼睛和一条尾巴,等等。

  • 往哪看:也许猫在一个角落里,那你只要一个角落一个角落找就行,你没必要同时考虑图片的左上角和右下角。

总之,你看的不是单个的像素点,你看的是一片一片的像素群的模式变化。

实现这个思想,需要引入一些神经网络没有的网络结构。

在卷积神经网络中,网络层分为卷积层、池化层、全连接层。

  • 卷积层:以过滤器为单位对输入数据进行处理,提取图像中某区域的局部特征
  • 池化层:划分图像中的不同区域,并将各个区域的特征提取出来,重新组成一个新的图像
  • 全连接层:和普通神经网络的网络层一样


在最基本的像素到最终识别的物体之间加入了几个 “卷积层”。

“卷积” 是一种数学操作,可以理解成 “过滤”,或者叫 “滤波”,意思是从细致的信号中识别尺度更大一点的结构。

每一个卷积层识别一种特定规模的图形模式,后面一层只要在前面一层的基础上进行识别,这就解决了 “看什么” 和 “往哪看” 的问题。

第一层,是先从像素点中识别一些小尺度的线条结构,像垂直条纹、水平条纹、斑点、颜色从亮到暗等等各种小结构。

第二层,是根据第一层识别出来的小尺度结构识别像眼睛、耳朵、嘴之类的局部器官。

第三层,才是根据这些局部器官识别人脸。

其中每一层的神经网络从前面一层获得输入,经过深度学习之后再输出到后面一层,从小结构上看出更大、更复杂也更多的结构来,点 -> 线 -> 面。

卷积神经网络结构:

网络层学习参数
卷积层过滤器、偏置
池化层
全连接层权重、偏置

卷积神经网络也和神经网络相同,通过反向传播算法学习,在卷积层中通过学习来实现过滤器最优化。

 


卷积层:提取局部特征

卷积:滑动加权求和

通过卷积运算,可对图像中某个特征进行选择性的增强或者减弱。

演示一下卷积过程,矩阵 B B B 以某个步长在 矩阵 A A A 表面 滑动加权求和

接着矩阵 B B B 从矩阵 A A A左上角 准备滑动,如下图:


黄色区域的元素相乘,得到 4 4 4 1 1 1相加值为 4 4 4

假设设定的滑动步长为 1 1 1 ,开始滑动,新一轮计算,方法相同,如下图:


继续滑动,对应位置相乘再求和得到 4 4 4,如下图:


继续滑动,对应位置相乘再求和得到 2,如下图:


…,最终矩阵卷积生成的矩阵,对比 矩阵 A A A 生成的矩阵小了一圈,如下图:


矩阵 B B B (小矩阵),也被称为过滤器。
 


过滤器:提取特征


如果检查的是垂直条纹,那过滤器如下:

sobel = np.array([[  1,  0,  -1 ],                        
                  [  2,  0,  -2 ],
                  [  1,  2,  -1 ]]) 

如果检查的是水平条纹,那过滤器如下:

sobel = np.array([[ -1, -2, -1 ],                        
                  [  0,  0,  0 ],
                  [  1,  2,  1 ]]) 

更好的是,通过训练神经网络来找到更好的过滤器:

sobel = np.array([[ w1, w2, w3 ],                        
                  [ w4, w5, w6 ],
                  [ w7, w8, w9 ]]) 

其实我们检测一张图片,除了垂直条纹、水平条纹,还有 55 度角边缘、70 度角边缘······

一个过滤器负责一个子任务,那识别起来就是要多个过滤器啦。

过滤器越多,学到的特征越多。

因为每个过滤器是不同的,所以他们会学到不同的特征。

我们可让输入图像同时与多个过滤器进行卷积运算。

比如下图同时和俩个过滤器进行卷积运算。

输入图像与每个过滤器进行卷积运算,都会生成一个相同维度的矩阵,而后我们可以把这俩个矩阵合并成一个二维的矩阵。

 


padding:填补矩阵维度

  • 图像矩阵维度 ( n , n ) (n,n) (n,n) * 过滤器维度 ( f , f ) (f,f) (f,f) = 结果矩阵 ( n − f + 1 ,   n − f + 1 ) (n-f+1,~n-f+1) (nf+1, nf+1)

就是经过卷积层运算的图像,虽然提取了局部特征,但是结果图像变小了:


卷积运算有俩个特点:

  • 原数据变小了,比如矩阵是 5x5,过滤器 3x3,一波卷积变成了 3x3,也就是说,一张图片突然缩小了 2 5 \\frac25 52,我们更想保护数据。
  • 矩阵里越是外围的元素,使用次数就越小,越是靠近中心,使用次数就越多,我们需要均衡一下。

所以,在卷积运算之前我们会进行填补。在原数据的矩阵中的最边缘,再加一条边。

  • padding 的结果矩阵维度:图像矩阵维度 ( n , n ) (n,n) (n,n),过滤器维度 ( f , f ) (f,f) (f,f),那结果矩阵 ( n − f + 1 ,   n − f + 1 ) (n-f+1, ~n-f+1) (nf+1, nf+1)
  • padding 的结果矩阵维度:图像矩阵维度 ( n , n ) (n,n) (n,n),过滤器维度 ( f , f ) (f,f) (f,f),那结果矩阵 ( n + 2 p − f + 1 ,   n + 2 p − f + 1 ) (n+2p-f+1, ~n+2p-f+1) (n+2pf+1, n+2pf+1),因为我们只加了一条边,所以 p = 1 p=1 p=1,这样卷积后原矩阵大小不变。

如果不用 padding 的话,图像周边的信息可能就会丢失了,原来边缘的元素,现在也可以参与运算多次了。
 


卷积步长:图像提取的精度

在上面卷积运算中,过滤器在原数据矩阵中只移动了一个位置,这时卷积步长为 1,我们也可以设置为 2 啦(前后左右走 2 个位置)。

其实,过滤器的步长度代表提取的精度:

  • 步长越大,提取特征越少;
  • 反之,提取特征越多。

比如,大小为 3 的过滤器,如果步长为 1 ,那相邻步之间就会有重复区域。

如果步长为 2,那么相邻步不会重复,也不会有覆盖不到的地方。

如果步长为 3,那么相邻步之间会有一道大小为 1 的缝隙,从某种程度来说,这样就遗漏了原图的信息,直观上理解是不好的。

还有一种情况,如果过滤器超越了矩阵范围,这次的卷积运算不会执行。


那依照经验来看卷积的步长通常怎么设置?

为了避免特征缺失,步长通常是 1。

卷积步长的结果矩阵维度:图像矩阵维度 ( n , n ) (n,n) (n,n),过滤器维度 ( f , f ) (f,f) (f,f),那结果矩阵 ( n + 2 p − f s + 1 ,   n + 2 p − f s + 1 ) (\\fracn+2p-fs+1, ~\\fracn+2p-fs+1) (sn+2pf+1, sn+2pf+1)

  • s s s 为卷积步长
  • n n n 为矩阵维度
  • p p p 为填补数量
  • f f f 为过滤器维度

 


3D 卷积

一张彩色图片,有 3 种颜色组成,也称之为 3 通道数。

有多少过滤器就可以提取多少个特征。

每个过滤器必须与输入图像有相同的通道数,即 3


一张黑白的图片是二维,我们可以直接进行卷积运算,但一张彩色图片,要么先把彩色图片转为黑白图片(三维降到二维),要么把过滤器也上升到三维。

二维卷积:


三维卷积:


 


池化层:压缩提纯

池化层通常被安排在卷积层的下,因为池化只是压缩提纯,所以卷积层、池化层通算一层。

划分图像中的不同区域,并将各个区域的特征提取出来,重新组成一个新的图像。


每个区域的最大值作为此区域的代表,称为最大池化层。

为什么一次移动俩个格子呢?

因为最大池化固定用 步长 s = 2 ,  维度 f = 2 步长s=2,~维度f=2 步长s=2, 维度f=2,这样特征图高度、宽度减半,通道数不变。

池化层是卷积层的压缩提纯,本质其实就是采样、画重点。

引入池化层(选择某种方式对其进行降维压缩),可降低网络的计算量,提升稳定性。

那我们怎么实现这个功能呢?

  • 最大值池化
  • 均值池化
  • 随机池化
  • 中值池化
  • 组合池化

卷积神经网络,一般用最大值池化。

卷积神经网络图示:

  • convolution:卷积层
  • pooling:池化层
  • fully connected:全连接层

卷积神经网络特点:

  • 卷积神经网络由卷积层、池化层、全连接层组成
  • 一般是由一个卷积层或者几个卷积层后接一个池化层,重复几组卷积层+池化层,再接一个或者几个全连接层
  • 卷积层的长、宽一直再变小(224 -> 112 -> 56 -> 28 -> 14 -> 7),高一直在变(64 -> 128 -> 256 -> 512)。
     

以上是关于卷积神经网络的主要内容,如果未能解决你的问题,请参考以下文章

研究成果|编码-解码多尺度卷积神经网络人群计数方法

EfficientNet 解析:卷积神经网络模型尺度变换的反思

基于 Pytorch 解读 GoogLeNet 现代卷积神经网络

论文《深度多尺度卷积LSTM网络的出行需求和出发地预测》

SIGAI深度学习第九集 卷积神经网络3

opencv学习-深度卷积神经网络