CNN Matlab例子RGB_CNN网络基础
最近在看DQN的时候发现resnet模型又有点不太理解,于是把从CNN到Resnet的资料看了一遍,以防忘记,整个备忘录。
卷积神经网络(CNN),是深度学习中常见的一种网络结构,相比于传统的神经网络大量的神经节点带来的内存消耗过大和参数爆炸,CNN的出现很好解决了这一问题。
一.CNN基本概念
1.filter
filter(过滤器),是用来在卷积过程中提取图像信息的基本单位。通过对过滤器中的参数设计,构建出不同种类的过滤器,可以提取图像中不同的信息。常见的有:vertical-filter,horizontal-filter,分别被用来提取垂直与水平特征。
一般来讲,filter的尺寸是奇数,这样做主要有两个好处:
(1)方便以filter中心进行卷积。
(2)在padding的过程中,方便图像两边对称(见下)
2.padding
在我们的卷积过程中,对于一个n*n的的image使用f*f的filter进行卷积,其得到的结果一般会变小:(n-f+1),为了使输入和输出的图像保持一致,对图像边界采用填充,即padding。在实际应用中,padding一般采取填0,除此之外还有镜像填充等填充方式。
增加padding后,输出图像的计算公式变成了:n+2p-f+1,当输入图像大小和输出大小相同时,有2p=f-1,这也就是我们为什么filter取值为奇数的原因。
padding的提出,主要解决了两个问题,即:
(1)卷积过程中图像尺寸的减小
(2)边缘信息的丢失
3.stride
stride(步长),即过滤器每次移动的长度,在实际用例中,一般默认为1。引入步长后,输出图像的计算公式变为:(n+2p-f)/s +1。
二.卷积神经网络结构
对于一个典型的CNN来说,其一般是由卷积层(Conv)、池化层(Pool),全连接层(Fc)堆叠构成的。对于池化层和卷积层,起主要的作用是用来提取图像的输入特征的,而全连接层更像一个分类器,根据前面池化层和卷积层得出的特征进行分类,三种网络交织,构成CNN。
1.卷积层
是由多种多样的filter通过扫描输入图像,来得到的。我们假设一个filter是3*3的,而他要处理的图像是5*5,设无padding并采取stride=1,得到的是一个3*3的输出图像,则输出图像的每个位置都进行如下运算:
卷积运算是过滤器与图片对应位置乘积的相加。此外,输入图像的通道数要与卷积核的通道数相匹配,最终的运算结果是通道的加和。以RGB图像为例,其输入通道有三,则过滤器为n*n*3。若有m个卷积核,则输出应为n*n*m。
2.池化层
池化层,其最主要的作用就是减小尺寸,提高运算速度,是为减少全连接层参数个数服务的。除此之外,池化层的使用也可以防止过拟合。
池化层常用的方法有:max pooling和average pooling。
对于max pooling,就是对应的filter所选区域保留最大值。
对于average pooling,就是对应区域保留平均值。
3.全连接层
对于全连接层中的每一层,都是由许多神经元组成的。假设对于一个具有1000个神经元的全连接层而言,其输入是一个3*3*5的,想要达成1000*1的输出,就要再做一次卷积,即将之前输出的变为一个确定的值,根据这个值的大小进行分类。
把特征表示合起来当做一个值输出,就很好的消除了位置的影响。举个很简单的例子,对于一张出现在左上角猫的图片和一张出现在右下角的猫的图片,虽然是同一只猫,但是由于其位置不同,我们的网络很可能会把他们当作两个类来看待,而化成值,即我们只需要判断这个值是否在该类判别的区间就好,这就消除了空间造成的误差,增强鲁棒性。
而当全连接层越多,神经元越多(一定程度上的多,不是越多越好,就会造成过拟合)。其对目标物体的分类就越精确。例如我们对于一个狗的识别,第一层全连接可能识别的是脸的一部分,比如鼻子,耳朵;而第二层全连接,就是把这些特征整合起来,比如整张脸作为一个分类,相当于一个逐步逼近实物的过程。