学习笔记:卷积神经网络(CNN)


前言

文章的内容是在我看了一些卷积神经网络的网课,以及文章后结合自己的理解,对于卷积神经网络的原理进行总结。
参考文章
https://cs231n.github.io/convolutional-networks/
https://towardsdatascience.com/convolutional-neural-network-1368ee2998d3

一、卷积神经网络是什么?

卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习模型,专门用于处理具有网格结构的数据,最典型的是图像。CNN通过引入卷积操作来自动提取数据中的特征,并在计算机视觉任务中表现出色。示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
如图可知,我们输入一张图片,经过卷积神经网络 Pooling、FC Layer、Convolution 等“一些列操作”后,会输出Pbird、Psunset、Pdog、Pcat等数据。如果Pbird等于0.7,那么计算机认为这张图片的内容70%的可能是鸟。下面我就具体来介绍这“一系列操作”。

二、卷积神经网络的具体步骤

卷积神经网络的基本构建模块包括卷积层、池化层和全连接层。

1.输入层

输入层就是要将图像的信息输入到卷积神经网络中,计算机看不懂图片,但是看得懂数字以及数字组成的矩阵。那么对于输入图像,首先要将其转换为对应的二维矩阵。输入层的作用就是将图像转换为其对应的由像素值构成的二维矩阵,并将此二维矩阵存储,等待后面几层的操作。
在学习卷积神经网络的具体步骤之前要学习图像的参数。在卷积神经网络中我们主要使用三个参数:hight×wide×chennel。其中hight和wide是图像的分辨率指的是图像或者显示屏在长和宽上各拥有的像素个数。比如一张照片分辨率为1920x1080,意思是这张照片是由横向1920个像素点和纵向1080个像素点构成,一共包含了1920x1080个像素点。在这里插入图片描述
而chennel指图像中不同颜色或特征的维度。对于彩色图像,每个像素由不同的通道信息组合而成,最常见的是RGB图像(红、绿、蓝三个通道)。每个通道控制该像素的某种颜色,在每个小格子(像素点)中会用0–255的数值去表示该区域颜色的深度(0表示颜色最浅,255表示颜色最深),这样图片的色彩信息就转化为了三个由很多个0–255之间的像素值所组成的矩阵。
在这里插入图片描述

2.卷积层

经过输入层我们已经将RGB图像转化为三个由像素值组成的矩阵,卷积层要做的事就是将庞大的特征数据进行提取。你要提取哪个特征,就可以将特征参数赋值给卷积核,由卷积核与矩阵中同样大小的区域进行矩阵相同的位置相乘再累加的方法,得出该区域与要提取特征的相似得分。卷积核不停的移动提取矩阵不同区域中我最需要的特征。通过卷积过后得到的就是特征图。下图中最中间的3×3矩阵就是一个卷积核,它和左边矩阵的浅蓝色窗口的矩阵对应项相乘再相加就得到最右边的155。(0×-1+0×-2+75×-1+0×0+75×0+80×0+0×1+75×2+80×1=155)
在这里插入图片描述

上图所示,卷积核每一次提取完特征,窗口都滑动一个单位,那么我们称滑动窗口的步长为1(stride=1)。
有些同学可能会注意到,窗口在滑动的时候,矩阵中间的数参与计算的次数明显要比边缘的数参与计算的次数多。矩阵的运算就是为了提取图片的特征,那么边缘的运算次数较少会不会造成边缘特征的信息不足呢,答案是会的。为了应对边缘特征信息的缺失,我们会在原始图像周围添加一个无关紧要的封面(白色边框),也就是在原始矩阵的周围加上一圈0。这样边缘缺失的特征信息都是我们不需要的,我们需要的特征信息全在中间。Padding为拓展的圈数。下面有Padding=1、Padding=2两个例子。
在这里插入图片描述
Padding=1在这里插入图片描述
Padding=2
在这里插入图片描述

下图是我们完整的去卷积一个彩色图片,图片最左边是RGB图像的三个chennel。中间的W1、W2是两个卷积核,每个卷积核由3个3×3的矩阵还有一个偏置项(Bias)组成,最右边两个矩阵是由两个不同的卷积核卷积得到的特征图。对于卷积的具体计算,还是与chennel=1时类似,卷积核的3个矩阵的与各个通道的矩阵的对应项相乘再相加,三个矩阵运算的结果相加最后再加上偏置项就得到了特征图中的一个数。
在这里插入图片描述

3.池化层

卷积层通过卷积核进行卷积让我们得到与卷积核个数相同的特征图,这些特征还是太多了,并且容易出现模型在训练数据上表现很好,但在未见过的测试数据上表现较差的现象,也就是过拟合。过拟合发生时,模型会过度拟合训练数据中的噪声或细微差异,导致其对新数据的泛化能力下降。为了解决这些问题,我们会用到池化层。
池化层是神经网络模型中的一种层类型,用于减少输入数据的空间尺寸,并提取我们刚刚卷积得到的数据的重要特征。
池化层可以看作是对输入数据的空间采样和降采样,通过在局部区域内进行聚合操作来减少特征图的维度。常见的池化操作包括最大池化(Maximum Pooling)和平均池化(Average Pooling)。
在这里插入图片描述
最大池化是在池化窗口内取窗口内的最大值作为输出,平均池化是取窗口内的平均值作为输出。如上图中【2,0,5,8】这个2×2的矩阵进行平均池化就是取所有元素的平均值(所有元素之和除以元素个数,(2+0+5+8)/4=3.75向下取整后得3),进行最大池化就是取所有元素中的最大值(8)。下图为完整的最大池化。
在这里插入图片描述
再来说一下池化层中的参数:
1.kernel_size 为一次池化的大小尺寸。如kernel_size = 2的话那一次池化的大小为一个2×2的正方形。
2.stride 为步长,指正方形每次移动的距离。如stride = 2的话那正方形一次移动2个格子。
在这里插入图片描述
池化层的基本原理我们讲完了,想要直观的感受池化层提取重要特征,减少特征图尺寸的作用请看上图,这是LeNet5的一部分层。其中input为输入层,C1、C2为卷积层,Pool1、Pool2为池化层。我们可以发现每次经过池化层输出的大小都会除以4。很明显池化层的kernel_size=2才会让特征信息的大小缩小到原来的1/4。

4.全连接层

在整个卷积神经网络中起到“分类器”的作用。卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。因为用到了所有的局部特征,所以叫全连接。
在分类任务中,全连接层通常作为网络的最后一层,直接将全连接层的维度设为类别数量或通过Softmax函数输出每个类别的概率分布,从而实现对输入数据的分类。
全连接层其实就是一个权重矩阵,计算过程其实就是通过一个矩阵,将一个向量转换成另外一个维度的向量。公式如下:

Vector(output) = Vector(input) × Weight(FC) + Bias(FC)
其中,Weight(FC) 表示全连接层的权重,Bias(FC)表示全连接层的偏置。
也就是说,如果输入全连接层向量的 shape 是(1,4),输出全连接层向量的 shape 是(1,3),显然学过线性代数的同学就知道了,这个全连接层权重的 shape 是(4,3),偏置的shape是(1,3)。如输入一个(2,2,2,2)的四维向量,需要输出一个三维向量,当权重矩阵的数值全为1,偏置矩阵的数值全为3时,计算过程如下:
在这里插入图片描述
总的来说,全连接层说简单一点就是通过我们之前提取的特征得到我们检测的物体是什么东西的一个概率,就像文章开头所说的得到张图片的内容70%的可能是鸟这个结果。

5.一个完整的神经网络示例

学完了卷积神经网络的各个层,那我们来看一个完整的卷积神经网络示例
在这里插入图片描述
这里显示的架构是一个小型的VGG网络,其中CONV为卷积层,POOL为池化层,FC为全连接层。这里我们对RELU有点陌生,RELU是一个激活函数。函数的具体内容如下图所示:
在这里插入图片描述
如果不加激活函数,那么神经元就仅仅做线性变换,以AlexNet为例,这个神经网络就会成为一个线性回归模型。而一个线性回归模型对于复杂非线性任务的处理能力是十分有限的。因此,我们需要添加非线性的激活函数,在神经网络的输入输出之间形成非线性映射,让网络能力更为强大。
回到我们的示例网络上来,该网络通过六个卷积层,三个池化层得到特征信息,再通过全连接层得到图片中待检测物体的种类概率。这就是一个小型的卷积神经网络。

总结

写文章的本意是记录自己学习的过程,内容可以源自于教学视频或者文章,我只是学完进行总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值