Author:陈桦、夏雨柔、樊亮
From:Datawhale
卷积神经网络CNN是深度学习中的基础知识。本文对CNN的基础原理及常见的CNN网络进行了详细解读,并介绍了Pytorch构建深度网络的流程。最后,以阿里天池零基础入门CV赛事为学习实践,对Pytorch构建CNN模型进行实现。数据及背景
https://tianchi.aliyun.com/competition/entrance/531795/introduction(阿里天池 - 零基础入门CV赛事)CNN原理
CNN,又称卷积神经网络,是深度学习中重要的一个分支。CNN在很多领域都表现优异,精度和速度比传统计算学习算法高很多。特别是在计算机视觉领域,CNN是解决图像分类、图像检索、物体检测和语义分割的主流模型。
1. 卷积
如图1所示,图中的X和O无论怎么旋转或者缩放,人眼其实还是很容易识别出X和O。
图1
但是计算机不同,它看到的其实是一个个的像素阵列,如图2。如何对像素的阵列进行特征的提取其实就是卷积神经网络要干的事情。
图2
再看图3,我们发现X即使进行了旋转,但是绿、橙、紫框标记的区域在两张图中还是一致的,某种程度上,这其实就是X的特征。
图3
因此可以将这三个特征的区间提取出来,就形成了三个卷积核,如图4所示。
图4
既然有了卷积核,那么卷积核是如何进行卷积操作的呢?其实很简单,可以看一下图5,卷积核其实就是拿着这个矩阵在图片的矩阵上一点点的平移,就像扫地一样。每扫到一处地方就可以进行卷积的运算,计算方法很简单,如图5所示,左上角的卷积核扫到绿色框的位置,则卷积核矩阵的数字就和扫到的位置的矩阵的数字一一对应相乘然后相加,最后取一个均值,该值就是卷积核提取的特征。
图5
卷积核提取的所有的特征组成了一个长和宽变小的矩阵,这个矩阵又称为feature map,如图6。使用不同的卷积核也就能提取出不同的feature map。所以可以想象的是,如果不断的进行卷积操作,那么图片的矩阵会逐步地长宽减少,厚度增加。
图6
可以看到卷积操作通过卷积核是可以分别提取到图片的特征的,但是如何提前知道卷积核呢?像上文的例子,很容易可以找到3个卷积核,但是假如是人脸识别这样成千上万个特征的图片,就没办法提前知道什么是合适的卷积核。其实也没必要知道,因为选择什么样的卷积核,完全可以通过训练不断优化。初始时只需要随机设置一些卷积核,通过训练,模型其实自己可以学习到合适的卷积核,这也是卷积神经网络模型强大的地方。2. 池化(pooling)
池化,也叫下采样,本质上其实就是对数据进行一个缩小。因为我们知道,比如人脸识别,通过卷积操作得到成千上万个feature map,每个feature map也有很多的像素点,这些对于后续的运算的时间会变得很长。池化其实就是对每个feature map进一步提炼的过程。如图7所示,原来4X4的feature map经过池化操作之后就变成了更小的2*2的矩阵。池化的方法包括max pooling,即取最大值,以及average pooling,即取平均值。
图7
3. Normalization
这里的Normalization就是将矩阵中负数的值转成0,也就是使用一个称之为ReLu的激活函数进行负数变为0的操作。ReLu函数本质上就是max(0,x)。这一步其实也是为了方便运算。
4. 卷积神经网络理解
因此卷积、ReLu、pooling,不断重复其实也就基本上构成了卷积神经网络的框架,如图8。然后将最终得到的feaure map 排成一列(图8),接到全连接层,这样就形成了我们的卷积神经网络。值得注意的是,排成一列的数值,是有权重,而这些权重是通过训练、反向传播得到的,通过权重的计算,可以知道不同分类的概率是怎么样的。
图8
卷积神经网络
卷积神经网络基础:LeNet5 手写字体识别模型LeNet5诞生于1994年,是最早的卷积神经网络之一。LeNet5通过巧妙的设计,利用卷积、参数共享、池化等操作提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别,这个网络也是最近大量神经网络架构的起点。如下图所示为LeNet网络结构,总共有7层网络(不含输入层),2个卷积层、2个池化层、3个全连接层。
在卷积层块中输入的高和宽在逐层减小。卷积层由于使用高和宽均为5的卷积核,从而将高和宽分别减小4,而池化层则将高和宽减半,但通道数则从1增加到16。全连接层则逐层减少输出个数,直到变成图像的类别数10。