卷积神经网络
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) (n−f+1, n−f+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) (n−f+1, n−f+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+2p−f+1, n+2p−f+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+2p−f+1, sn+2p−f+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 解析:卷积神经网络模型尺度变换的反思