暑期学习 CNN 笔记
1. 传统NN 与 CNN
- 同:它们都由具有权重和偏置的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的得分。普通NN里的一些计算技巧在CNN里依旧适用。
-
异: CNN是具有三维体积的神经元(比NN多一个depth)。CNN利用输入是图片的特点把神经元设计成三个维度 : width、height、depth(注意这里的depth不是网络的深度,而是描述神经元的)。比如输入的图片大小是 24 × 24 × 3 (rgb),那么输入神经元就也具有 24×24×3 的维度。
2. CNN组成部分
主要部分有:
- [ 输入层 ]
- [ 卷积层 ]
- [ **函数 ]
- [ 池化层 ]
- [ 全连接层 ]
基本结构:
input → conv → relu → pool → fc
2.1 卷积层
【1】卷积的目的——提取特征
在15*15图像上提取特征,不是逐个像素点提取,而是一小块、一小块的进行提取。将图像分为许多小块进行提取,过程如下。下图假设图像的提取一小块为5*5。例如第一块里提取到的特征值为1(一块区域只映射为一个值),第二块里提取到的特征值为4,第三块里提取到的特征值为5……
注:在上文中的那一小块的单元格称为 filter 。或者叫滤波器。下图左是一张图像(3维矩阵),红色框标注的“数字3”代表3个通道。右为一个filter,是人为指定的 5*5 大小,红色框标注的“数字3”是根据左图的矩阵格式来的。
其实实际情况中的filter是有depth的。
注:卷积神经网络提取特征不可能这么少,所以可能有多个filter来提取,如filter1,filter2……等得到多个2维矩阵合并为3维矩阵。每个5*5*3的filter相当于一种不同的特征变换。下图中假设6个filter提取32*32*3的图像,每个filter提取得到一张特征图 feature map,六张特征图堆叠起来最终得到了28*28*6。(可以适当思考32、5和28之间的关系)
【2】卷积神经网络的流程——堆叠
CNN就是将一系列的卷积操作堆叠在一起,如下图。
原始输入为32*32*3,经过第一次卷积、relu操作后得到一个深度为6的特征图。神经网络中多个隐层(在这里是卷积层)进行多种特征提取,然后特征从低级语义到高级语义。
【3】卷积的计算流程——数字怎么得到的
-
权重参数
w 就是 filter
在NN里面的参数都是初始化好的,filter也有初始值,然后训练的目的就是在迭代优化过程中不断调整filter的内容。
最左图是 7*7*3,3个通道分为左侧三张图描述【0】【1】【2】。 中间两列是两种 3*3*3 filter,内容也展开为3个平面矩阵描述。
在输入矩阵上滑动 filter 进行内积计算(对应方格数字相乘最后加和),再加上偏置 bias 。
如上图计算过程,第一通道内积为0;第二通道内积为2;第三通道内积为0;全部加和为 0+2+0,最后再加上bias=1,得2+1=3。
注意:卷积运算的内积操作是分通道的,只能是在对应通道的输入和对应通道的 filter 运算。从上图可以看出 x[1] 只和 w0[1] 内积。
filter 每步滑动多远——步长
如下图,步长stride为2,即往右移动2个单元格。
再回到上图流程,这一次卷积用到了两个filter,所以output得到的是 3*3*2 的特征图。
上图最右侧得到的两个绿色矩阵,output【0】针对w【0】;output【1】针对w【1】。
【4】卷积层的参数们
关于pad:边缘填充(补零)。原始数据如果直接滑动内积,则越靠近中间的像素点重要程度被变大,边缘像素点被减弱。补零是为了让边缘像素点利用率变高,让原始数据被利用的更丰富。
结论:
- 输入:
W1∗H1∗D1 - filter:大小
F ,(即F∗F );个数K - pad:填充圈(层数)
P - stride:
S - output:
W2∗H2∗D2
W2=(W1−F+2P)/S+1 H2=(H1−F+2P)/S+1 D2=K
1、 例子:W1=32;H1=32;D1=3;F=5;K=10;P=2;S=1;则
W2 = (W1-F+2P)/ S+1=(32-5+4)/1+1=32
H2 = (H1-F+2P)/ S+1 = W2 = 32
D2 = K=10
注:这里32*32*3 映射到了 32*32*10
参数数量 =(F * F * D+1)* K=760;【1指的是bias】
2、划分多个不同小区域的所用filter参数是一样的,这叫做权值参数共享,参数量比普通NN减少很多数量级。实际并没有规定输入和filter为方阵,但基本上都采用方阵。
2.2 池化层
池化层不需要计算,相对来说比较简单。因此也只有在这 pooling 层,才不涉及
w 、b 等参数。
卷积后得到的特征图如果相当庞大时,需要进行压缩。池化层的意义:一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩(下采样down sampling的目的,参数多的时候保证实时性),提取主要特征。
注意:压缩以后,此时只有
w ,h 发生了变化,特征图的depth 不变。
- 如何压缩?
- max pooling
- Avy Pooling
-
max pooling方法
如上图采用一个2*2的filter,则根据stride=2划分了四块区域,max pooling是在每一个区域中寻找最大值最终压缩到1/2*1/2。
Avy pooling 基本上现在灭绝了(其实就是平均池化层),方法是对每一个2*2的区域元素求和再除以4求均值,得到主要特征)。
注意:这里的pooling操作是特征图缩小,有可能影响网络的准确度,因此可以通过增加特征图的深度来弥补(这里的深度变为原来的2倍)。
3. CNN 的整体架构
3.1 架构的特点
- [ conv → relu → conv → relu → pool ] 为一个循环块,最后连上 FC(全连接层)。如下图,注意循环为什么可以相连,因为在 pooling 完以后,特征图的个数 K 不发生变化。
3.2 全连接层
- 全连接层:连接所有的特征,将输出值送给分类器(如softmax分类器)。在整个卷积神经网络中起到 分类器 的作用。
-
如下图,假设后面卷积得到的特征图是:
7∗7∗2 ,最后将该立体的特征图数据拉直成一条列向量98∗1 。将该列向量映射到高维如1024∗1 。最后接上softmax分类器输出各个类别的概率值。
4. 经典网络
4.1 ALEXNET
- FC层:分类为1000类的概率。
- conv1:filter 尺度太大,提取效果不太恰当。
- 8层的网络结构:什么才能称为一层?带参数的层(一般指卷积层、全连接层;pooling不含参数)
4.2 VGGNET
- 具有代表性,效果也还可以。
- 框架的参数信息如下。可知,filter和stride都非常小,利用原始数据信息更充分即利用更多的特征。
- F=3;P=1;S=1;可得输出的map的H2 or W2=(H1-3+2*1)/1+1=H1,大小不发生变化。
- map虽然每次池化完后变小了,但每次池化后map的个数K翻倍了,这是效果好的原因。【64-pool-128-pool-256-pool-512】
结语
这节内容干货较多,重点是理解工作原理和参数的作用。经典模型的话不用GPU显卡估计玩不开(迭代太慢,batchsize受限)了。N卡支持深度学习框架,推荐泰坦X(12G),1080(8G),1060(6G)。