概念
卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。 它包括卷积层(convolutional layer)和池化层(pooling layer)。
对比:卷积神经网络、全连接神经网络
左图:全连接神经网络(平面),组成:输入层、激活函数、全连接层
右图:卷积神经网络(立体),组成:输入层、卷积层、激活函数、池化层、全连接层
在卷积神经网络中有一个重要的概念:深度
主要是以下层次:
- 数据输入层/ Input layer
- 卷积计算层/ CONV layer
- ReLU激励层 / ReLU layer
- 池化层 / Pooling layer
- 全连接层 / FC layer
- Batch Normalization层(可能有)
数据输入层/ Input layer
有3种常见的数据处理方式
a. 去均值 ==> 把输入数据各个维度都中心化到0
b. 归一化 ==> 幅度归一化到同样的范围
c. PCA/白化 ==> 用PCA降维(白化是对数据每个特征轴上的幅度归一化)
********去均值与归一化
********去相关与白化
卷积层
卷积:在原始的输入上进行特征的提取。特征提取简言之就是,在原始输入上一个小区域一个小区域进行特征的提取,稍后细致讲解卷积的计算过程。
上图中,左方块是输入层,尺寸为3232的3通道图像。右边的小方块是filter,尺寸为55,深度为3。将输入层划分为多个区域,用filter这个固定尺寸的助手,在输入层做运算,最终得到一个深度为1的特征图。
上图中,展示出一般使用多个filter分别进行卷积,最终得到多个特征图。
上图使用了6个filter分别卷积进行特征提取,最终得到6个特征图。将这6层叠在一起就得到了卷积层输出的结果。
卷积不仅限于对原始输入的卷积。蓝色方块是在原始输入上进行卷积操作,使用了6个filter得到了6个提取特征图。绿色方块还能对蓝色方块进行卷积操作,使用了10个filter得到了10个特征图。每一个filter的深度必须与上一层输入的深度相等。
直观理解卷积
以上图为例:
第一次卷积可以提取出低层次的特征。
第二次卷积可以提取出中层次的特征。
第三次卷积可以提取出高层次的特征。
特征是不断进行提取和压缩的,最终能得到比较高层次特征,简言之就是对原式特征一步又一步的浓缩,最终得到的特征更可靠。利用最后一层特征可以做各种任务:比如分类、回归等。
卷积计算流程
涉及概念:
深度/depth(像素通道个数)
步长/stride:窗口(卷积核)每次滑动的单元
填充值/zero-padding:两种方式:
1、SAME PADDING(给平面外部补0):
卷积窗口采样后得到一个跟原来平面大小相同的平面
2、VALID PADDING(不会超出平面外部):
卷积窗口采样后得到一个比原来平面小的平面
卷积流程:
1.左区域的三个大矩阵是原式图像的输入,RGB三个通道用三个矩阵表示,大小为773。
2.Filter W0表示1个filter助手,尺寸为3*3,深度为3(三个矩阵);Filter W1也表示1个filter助手。因为卷积中我们用了2个filter,因此该卷积层结果的输出深度为2(绿色矩阵有2个)。
3.Bias b0是Filter W0的偏置项,Bias b1是Filter W1的偏置项。
4.OutPut是卷积后的输出,尺寸为3*3,深度为2。
计算过程:
输入是固定的,filter是指定的,因此计算就是如何得到绿色矩阵。第一步,在输入矩阵上有一个和filter相同尺寸的滑窗,然后输入矩阵的在滑窗里的部分与filter矩阵对应位置相乘:
即与对应位置相乘后求和,结果为0。
即与对应位置相乘后求和,结果为2。
即与对应位置相乘后求和,结果为0。
第二步,将3个矩阵产生的结果求和,并加上偏置项,即0+2+0+1=3,因此就得到了输出矩阵的左上角的3:
第三步,让每一个filter都执行这样的操作,变可得到第一个元素:
第四步,滑动窗口2个步长,重复之前步骤进行计算
第五步,最终可以得到,在2个filter下,卷积后生成的深度为2的输出结果:
滑动的步长叫stride记为S。S越小,提取的特征越多,但是S一般不取1,主要考虑时间效率的问题。S也不能太大,否则会漏掉图像上的信息。
②由于filter的边长大于S,会造成每次移动滑窗后有交集部分,交集部分意味着多次提取特征,尤其表现在图像的中间区域提取次数较多,边缘部分提取次数较少,怎么办?
一般方法是在图像外围加一圈0,细心的同学可能已经注意到了,在演示案例中已经加上这一圈0了,即+pad 1。 +pad n表示加n圈0.
激励层(ReLU)
把卷积层输出结果做非线性映射,常见的激励函数有下面这些:
- Sigmoid(当加权输入值小于0时,梯度变化太小,无法训练)
- Tanh(双曲正切)(同上)
- ReLU(收敛快,求梯度简单,较脆弱,当输入小于0的时候,输出全部为0,梯度消失问题)
- Leaky ReLU
- ELU
- Maxout
图像分别如下:
激励函数的选取:
首先试RELU, 因为快, 但要小心点,如果失效改用Leaky ReLU或者Maxout
池化层 / Pooling layer
它是夹在连续的卷积层中间,池化层可以非常有效地缩小矩阵的尺寸。从而减少最后全连接层中的参数。使用池化层既可以加快计算速度也有防止过拟合问题的作用。池化层前向传播的过程中也是通过一个类似过滤器的结构完成的,池化层中的计算不是节点的加权和,而是采用了更加简单的最大值或者平均值计算。使用最大值操作的池化层被称之为最大池化层(max pooling),使用平均值操作的池化层称之为平均池化层(average pooling),总的来说,池化层的作用是可以压缩数据和参数的量, 减小过拟合(我觉得有点像马赛克的感觉。。)
全连接层 / FC layer
在经过多轮卷积核池化层的处理之后,可以认为图像中的信息已经被抽象成了信息含量更高的特征,在特征提取完成之后,仍然需要使用全连接层来完成分类任务。(有仅有的信息把原来的信息给还原回来)
a. 两层之间所有神经元都有权重连接
b. 通常全连接层在卷积神经网络尾部
总结
上面说了这么多,最后我们来聊一下CNN的优点和缺点:
1)优点
共享卷积核, 对高维数据处理无压力
无需手动选取特征, 训练好权重, 即得特征
深层次的网络抽取图像信息丰富, 表达效果好
2)缺点
需要调参, 需要大样本量, 训练最好要GPU
但是我表示在用GPU做训练的时候,刚开始报错,说是启动程序太多,歇菜了,关掉之后,再次程序启动,电脑声音超级响,感觉电脑随时都要废掉。。。。
物理含义不明确,抽象出来的特征,我们无法确定这些特征到底是哪方面
参考:
https://blog.csdn.net/lazyGril_81/article/details/80641719
https://blog.csdn.net/weixin_42451919/article/details/81381294