卷积神经网络(Convolution Neural Network)是一种神经网络的架构设计,专门用于影像处理上。
一、卷积层
现在用不同方式来介绍卷积神经网络。
角度一:神经元版本
给出一个图像,我们如何用神经网络将其分类呢?现在我们来观察图片的特点。
1. 观察一
对于不同大小的图片,先将其处理为大小相同,再进行后续步骤
例如:
- 输入:一批100*100固定大小的图片
- 输出:动物类别,表示为一个列向量,每个纬度表示一个动物的种类,且非零即一(0代表“不是该类别”,1代表“是该类别”),记作
y
^
\hat y
y^?
其实我们在判断一个事物种类的时候,往往就是抓最重要的特征!因此我们要神经元做的事情就是 有没有某种特征出现,并不需要让它们去看完整的图像。
简化一:设计神经网络
- 让每个神经元关注一部分区域,这个区域就是神经网络 感受野(receptive field)
- 现假设 特征图填充宽度(padding) 为3×3×3,将其变为一个27维的列向量作为神经元的输入
- 感受野的决定在于我们自己,并且感受野是可以重叠的,多个神经元可以有同一个感受野。
- 假设有两个完全没有重叠,有的特征就正好出现在两个感受野的交界上面,就会没有神经元去侦测它,导致错过这个特征。因此希望两个感受野之间有高度的重叠。
Q&A
- Q:感受野的尺寸是否随不同的神经元大小而改变?
A:因为有些特征需要一些适当的尺寸才能被侦测出来,因此需要变换大小。 - Q:感受野是否能只考虑某些通道?
A:可以,但是一般CNN里面不考虑此法。 - Q:感受野可以是任意矩形吗?
A:可以,这是自己设计。 - Q:卷积步长 (stride) 的设计中,必须让每个感受野相邻或重叠吗?
A:最好是相邻,因为要完全遍历找出特征。但是解决一些特殊问题可以不相邻。
2. 观察二
但是这些侦测鸟嘴的神经元的功能都是一样的,只是扫描的范围不一样。为了简化程序,不需要在每一个地方都安排一个相同功能的神经元,这就需要做 参数共享(parameter sharing)。
简化2:参数共享
3. 简化方法总结
- 全连接层,一个神经元检测所有范围或某个范围,网络弹性最大,但是我们不需要看整张图片,看一小部分就能侦测到重要的特征
- 加入感受野,强制神经元检测某个小范围,网络弹性变小
- 加入参数共享,进一步限制了网络的弹性。
感受野 + 参数共享 → 卷积层(Convolutional Layer),使用卷积层的神经网络,就称为CNN.
CNN的模型偏差比较大,不容易过拟合,专为影像设计。
角度二:卷积核版本
查看 卷积核filter和kernal的区别
卷积层里面有很多卷积核(filter),假设它们的大小是3×3×通道(彩色为3,黑白为1) 下面是卷积层的计算:
- 用卷积核与图像进行矩阵乘积运算,这样做可以在我们想要的特征上进一步增强,其余削弱
- 经过所有卷积核运算输出的n组数字,称为Feature Map
- 卷积核扫描图像的过程就叫做卷积
两种角度都是同一件事情
神经元版本 | 卷积核版本 |
---|
每个神经元只需要考虑一个感受野 | 用一组卷积核检测一小部分范围 | 不同的神经元共享参数 (同样的特征可能出现在图片的不同位置) | 每个卷积核要扫过整张图片 |
二、池化层 (Pooling Layer)
池化层位于卷积层之后,其作用就是把图片变小:把一张图片做 下采样(subsampling),把一张大的图片缩小,且保留关键信息,降低卷积网络计算的复杂度。
池化有很多不同的版本,这里介绍的是Max Pooling
最大池化(Max Pooling)
运作:
- 每个卷积核都产生一组数字
- 池化的时候,把每个卷积核产生的数字分组(例如:2×2,自行决定)
- 每一组里面选最大一个 (局部最大值)
- 经过池化层,图像的通道不变,但是图片变小
做完几次卷积和池化操作以后,需要对池化的输出做 扁平化(Flatten) 操作:把矩阵拉直成列向量。再把向量输入进全连接层,可能需要做softmax激活,最终输出得到结果。
- 整个CNN流程如下:
三、CNN的应用:围棋 Alpha Go
下围棋其实就是一个分类的问题
输入(棋盘上黑子和白子的位置)→ 神经网络 → 下一步落子的位置
- 棋盘:19 * 19 的向量
- 黑子:1;白子:-1;空:0
相比于全连接网络,该问题用CNN的效果更好:
- 棋盘看做19*19的图片,每个像素代表可以落子的位置
- 每一个像素(棋盘的位置),用48个通道(数字)来表示
为什么CNN能用于下围棋?因为围棋和影像有共同的特性
- 很多重要的图案,只需要观察小范围
- Alpha Go 里面第一层的卷积核大小为 5 * 5
- 同样的图案可能出现在不同的位置
- Alpha Go 并没有用池化层
- 池化会丢失棋盘大小信息
CNN 还可以用于语音、自然语言处理上,这里的CNN是独立设计的,并不能直接从图像上照搬过去。
另外,CNN不能处理图像放大缩小以及旋转的问题,我们往往要对它做 数据增强(Data Augmentation) 。Spatial Transformer Layer 能处理这个问题。
- 假设给CNN输入了一张图片,输出为“狗”。然而把图片放大后,它可能不会辨识出是一只狗(矩阵拉长为向量,里面的数值都不一样,因此对CNN来说,二者是非常不一样的)。
|