自学参考:
一文搞懂卷积神经网络(CNN)的原理
视频课
课件+资料
笔记
一、引入
- cnn设计灵感来自于生物学中的视觉系统,旨在模拟人类视觉处理的方式。
- 常用场景:image classification
- 基本步骤:
- 把所有图片都先rescale成大小一样
- 把每一个类别,表示成一个one-hot的vector(dimension length决定了模型可以辨识出多少种类的东东)
- 把图像输入到模型中
直接摊开的话参数量过大。若输入的向量长度是100* 100*3,有1000个neuron,则第一层的weight就有1000 * 100 *100 * 3,即3 *107,是一个庞大的数量。
虽说随着参数的增加,可以增加模型的弹性,增加其能力,但也增加了overfitting的风险
⇒考虑到影像辨识问题本身的特性,无名并非一定需要fully connected,无需每一个neuron和input的每一个dimension都有一个weight
- 基本步骤:
二、神经元角度
-
思考①:模型通过识别一些“特定模式”来识别物体,而非“整张图”
⇒neuron也许并不需要把整张图片当作输入,只需把图片的一小部分当作输入,就足以让它们侦测某些特别关键的pattern是否出现
-
简化①:设定感受野receptive field
每个神经元只需要考察特定范围内的图像信息,把图像内容展平后输入到神经元即可。其中:- 感受野之间可重叠
- 一个感受野可有多个神经元选择(共享权重)
- 感受野大小可以“有大有小”(一般不做过大的kernal Size,常常设定为3*3)
- 感受野可以只考虑某些channel
- 感受野可以是“长方形”的
- 感受野理论上不一定要“相连”
-
感受野的一般设置typical setting
- 看所有的channel
一般在做影像辨识时会看全部的channel,则描述一个感受野时无需说明其channel数,只要说明其高宽即可
⇒kernel size - 每个感受野会有不止一个神经元进行守备
⇒输出通道数/卷积核数 - 不同的感受野之间的关系
⇒感受野的平移位移:stride(超参数)
一般会让感受野之间有重叠,避免交界处的pattern被遗漏 - 感受野超出影响的范围
⇒padding(补值)
补0;补平均值;补边缘值 - 垂直方向移动
- 看所有的channel
-
思考②:同样的pattern可能出现在图片的不同位置
侦测同样pattern的神经元做的工作是类似的
⇒共享参数
-
简化②:Parameter Sharing权值共享(不同感受野的神经元共享参数)
守备的 Receptive Field 不一样,但是它们的参数一样(守备相同感受野的神经元,不希望参数一样,否则无意义)
-
参数共享的一般设定
对每个感受野,都使用一组相同的神经元进行守备;这一组神经元被称作filter,对不同感受野使用的filter参数相同
-
卷积层的优势
卷积层是“受限”(弹性变小)的FC- FC可通过“学习”决定要看到的图片的范围。加上“感受野”概念后,就只能看某一个范围
- FC可以自由决定守备不同“感受野”的各个神经元参数。加上“权值共享”概念后,守备不同感受野的同一个滤波器filter参数相同
一般而言,model bias小,model的flexibility很高时,容易overfitting。FC层样样通,样样松(可以做各种各样的事情,可以有各种各样的变化,但可能无法在任何特定任务上做好)
CNN的bias较大,专门为影像设计,则它在影像上可以做得很好
三、滤波器角度
- 卷积层基本定义:
卷积层中有若干个filter,每个filter可用来抓取图片中的某一特征(特征pattern的大小 小于感受野大小)。
filter的参数,即为神经元中的权值weight
不同的filter扫过一张图片,将会产生“新的图片”,每个filter会产生图片中的一个channel(feature map)
filter的计算是内积:filter和图片对应位置的数值直接相乘,所有乘完后再相加
- 多层卷积:让小卷积核看见大pattern
如下图,第一层的卷积结果,产生了一张 3 × 3 × 64 3\times3\times64 3×3×64的feature map。
继续卷积时,需要对64个channel都进行处理
⇒filter的“高度”为64
这里,在第二层中考虑 3 × 3 3\times3 3×3的范围,在原图实际上考虑了 5 × 5 5\times5 5×5范围内的pattern。当卷积层越来越深时,即使只是 3 × 3 3\times3 3×3的filter,看到的范围也会越来越大。
- 卷积运算中也有bias,一般忽略
- 小结:
- 不用看整张image
- 神经元角度:只要守备感受野
- 滤波器角度:使用滤波器侦测模式pattern
- 图片不同位置的相同模式pattern:
- 神经元角度:守备不同感受野的神经元共用参数
- 滤波器角度:滤波器“扫过”整张图片
- 不用看整张image
- 思考③:图片降采样不影响图片的辨析
⇒Pooling(池化)把图片变小,减小运算量
Pooling本身没有参数,所以它不是一个 Layer,没有要 Learn 的东西。行为类似于一个 Activation Function(Sigmoid , ReLU ),是一个 Operator,它的行为都是固定好的。
大小可调整
- The whole CNN(典型分类网络结构):conv-pooling-…(循环)-flatten-FC-softmax
一般:卷积与池化(可选,减小运算量)交替使用
Pooling对 Performance,会带来一点伤害的。如果你运算资源足够支撑你不做 Pooling 的话,很多 Network 的架构的设计,往往今天就不做 Pooling,全 Convolution。