https://blog.csdn.net/weixin_42278173/article/details/81776807
卷积神经网络(CNN)的原理
本文主要内容:
- CNN的定义
- CNN的构成
- CNN的使用
- CNN的代码(Tensorflow)
CNN的定义:
CNN是一种前馈神经网络,前馈神经网络是一种最简单的神经网络。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。
简单来说,是一种单向多层结构。同一层神经元之间没有互相连接,层间信息传达只沿一个方向进行。除输入层,输出层,中间的全部为隐层,隐层为一层或多层。
CNN在模式分类领域由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。
CNN工作的概述:挑一张图像,经历一系列卷积层,非线性层,池化(下采样(downsampling))层和完全连接层,最终得到输出。输出的是描述了图像内容的一组分类概率。
CNN对比经典的神经网络:
- 在经典的神经网络中,整张图片会被传入网络中来训练各网络层权值。当输入为简单居中的图像时,如Mnist手写数字图,网络识别效果较优,但是当输入变为更为复杂多变的图像时,如跳上窗户的小猫,此时网络识别效果不佳甚至无法辨识。
- 加入更多隐含层学习输入图像的抽象特征,可能会有所帮助,但是这样会增加神经元的数目,大大增加训练所需的计算资源和占用过多的内存,这是不切实际的。
- CNN识别目标的过程,是先寻找诸如边缘、线段和曲线等相关低级特征,然后使用多个卷积层来构建更多抽象的高级特征。
- 在卷积层的学习过程中,CNN网络通过共享多个卷积核(或特征检测器)的权值,来学习每张图片的局部信息,并用于构建抽象特征图谱。卷积核共享特性大大降低了训练网络所需的参数量。
P.S.: 这里介绍一下RGB的相关知识,下面的叙述过程会用到。
RGB:是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的。RGB各有256级亮度(0~255),一个像素包含2^24种颜色。(32位颜色也是2^24中颜色,但是增加了2^8的灰度)。
因此,在图像识别领域,一个像素通常具有三个通道,相当于一个像素代表一个三元素一维数组,这在卷积核的设定上是非常重要的。
CNN的构成:
1. 卷积层:
首先,介绍卷积的定义。卷积是通过两个函数f 和g 生成第三个函数的一种数学算子。在这里就是指的卷积核和输入项进行运算得到新的输出项。
激活映射(特征映射):如果输入的是一个32×32×3的像素值数组,过滤器(有时候也被称为神经元(neuron)或核(kernel))作用于感受野(receptive field),过滤器是一个数组(其中的元素被称为权重或参数),重点在于过滤器的深度必须与输入内容的深度相同(这样才能确保可以进行数学运算),因此过滤器大小为 5 x 5 x 3。过滤器首先在图像左上角,向右以每次一个像素滑动,每次滑动前过滤器中的值会与图像中的原始像素值相乘(又称为计算点积)。这些乘积被加在一起得到一个数。由于这种过滤器能得到28×28个结果,因此结果可以表示为一个28×28的数组。
当我们使用两个而不是一个 5 x 5 x 3 的过滤器时,输出总量将会变成 28 x 28 x 2。采用的过滤器越多,空间维度( spatial dimensions)保留得也就越好。每个卷积核检验的特征不同。
EXAMPLE:
这里我们给一个曲线过滤器—每个过滤器可以看成是特征标识符( feature identifiers)。这里的特征指的是例如直边缘、原色、曲线之类的东西。想一想所有图像都共有的一些最简单的特征。假设第一组过滤器是 7 x 7 x 3 的曲线检测器。
简单来说,如果输入图像上某个形状看起来很像过滤器表示的曲线,那么所有点积加在一起将会得出一个很大的值,如果移动过滤器,会出现:
这个值小了很多。这是因为图像的这一部分和曲线检测器过滤器不存在对应。该卷积层输出的是一个激活映射,因此,在这个带有一个过滤器卷积的例子里(当筛选值为曲线检测器),激活映射将会显示出图像里最像曲线的区域。
在该例子中,28 x 28 x 1 的激活映射的左上角的值为 6600。高数值意味着很有可能是输入内容中的曲线激活了过滤器。激活地图右上角的值将会是 0,因为输入内容中没有任何东西能激活过滤器(更简单地说,原始图片中的这一区域没有任何曲线)。这仅仅是一组检测右弯曲线的过滤器。还有其它检测左弯曲线或直线边缘的过滤器。过滤器越多,激活映射的深度越大,我们对输入内容的了解也就越多。
假设我们采用三个 5 x 5 x 3 的过滤器,第一个卷积层的输出将会是一个 28 x 28 x 3 的数组,三个过滤器代表三个特征。
当我们进入另一卷积层时,第一个卷积层的输出便是第二个卷积层的输入。第一层的输入是原始图像,而第二卷积层的输入正是第一层输出的激活映射。第二层的输入大体已经描绘了低级特征在图片中的位置。在此基础上再采用一组过滤器(让它通过第 2 个卷积层),输出将是表示了更高级的特征的激活映射。这类特征可以是半圆(曲线和直线的组合)或四边形(几条直线的组合)。随着进入网络越深和经过更多卷积层后,你将得到更为复杂特征的激活映射。
越深入网络,过滤器的感受野越大,意味着它们能够处理更大范围的原始输入内容。
2. 完全连接层:
完全连接层观察上一层的输出(其表示了更高级特征的激活映射)并确定这些特征与哪一分类最为吻合。完全连接层观察高级特征和哪一分类最为吻合和拥有怎样的特定权重,因此当计算出权重与先前层之间的点积后,你将得到不同分类的正确概率。
(说白了全连接就是一个分类器。将上层抽取出来的特征向量在里面做一个权重计算,输出各个类别的概率,就是这个,没了。)
另外,全连接层是将前面得到的Feature map整合为一个值,如果这个值大,说明符合我们要找的特征,和位置无关。全连接层之前的部分作用是提取特征,全连接层的作用是分类。
(例如,全连接层是一个100*1000的矩阵,1000个数字每个数代表了一个基本特征,得到1000个具体特征的值(值越大,说明特征越明显),然后后面的全连接层就可以对这些特征进行进一步分类,比如分为狗,猫,鸡,就会通过一个1000*3的矩阵来得到一个1*3向量,用于分类。)
3. 池化层:
一旦我们知道了原始输入(这里会有一个高激活值,即特征明显的表现)中一个特定的特征,它与其它特征的相对位置就比它的绝对位置更重要。这一层大幅减小了输入卷的空间维度(长度和宽度改变了,但深度没变),叫做池化层。
两个主要目的:
- 权重参数的数目减少到了75%(在池化层是2x2的前提下),因此降低了计算成本。
- 控制过拟合。
池化层有多种选择:
- 最大池化:采用了一个过滤器(通常是 2x2 的)和一个同样长度的步幅。然后把它应用到输入内容上,输出过滤器卷积计算的每个子区域中的最大数字。
- 平均池化。
- L2-norm池化。
4. Dropout层:
防止神经网络的权重与训练样本太过匹配以至于在处理新样本的时候表现平平。
Dropout 的概念在本质上非常简单。Dropout 层将「丢弃(drop out)」该层中一个随机的激活参数集,即在前向通过(forward pass)中将这些激活参数集设置为 0。
好处是该网络将能够为特定的样本提供合适的分类或输出,即使一些激活参数被丢弃。此机制将保证神经网络不会对训练样本「过于匹配」,这将帮助缓解过拟合问题。
另外,Dropout 层只能在训练中使用,而不能用于测试过程,这是很重要的一点。
CNN的使用:
训练(TRAIN):
计算机通过一个名为反向传播的训练过程来调整过滤器值(或权重)。
(训练的过程就是一个刚出生的小孩子逐渐成长的过程。CNN 经历的便是一个介绍图片与分类标记的训练过程。在深入探讨之前,先设定一个训练集,在这里有上千张狗、猫、鸟的图片,每一张都依照内容被标记。反向传播分为四部分:前向传导,损失函数,后向传导以及权重更新。损失函数用最常用的MSE。)
我们训练时优化的目标是预测标记(卷积网络的输出)与训练标记相同(意味着网络预测正确)。为了做到这一点,我们想要将损失数量最小化。将其视为微积分优化问题的话,也就是说我们想要找出是哪部分输入(例子中的权重)直接导致了网络的损失(或错误)。
学习速率不能太大也不能太小,高学习速率意味着权重更新的动作更大,因此可能该模式将花费更少的时间收敛到最优权重。然而,学习速率过高会导致跳动过大,不够准确以致于达不到最优点。这一点可以通过下图形象地展现:
总的来说,前向传导、损失函数、后向传导、以及参数更新被称为一个学习周期。对每一训练图片,程序将重复固定数目的周期过程。
测试(TEST):
准备另一组测试样本,以及样本对应的标记集合(TEST和Training要使用不同的数据集),使其通过CNN。输出与实际情况相比较,来检测网络是否有效。
步幅:步幅设置要保证输出内容是整数而不是分数。步幅越大,空间维度越小。
填充:如果把 5 x 5 x 3 的过滤器用在 32 x 32 x 3 的输入上时,输出的大小会是 28 x 28 x 3。注意,这里空间维度减小了。如果我们继续用卷积层,尺寸减小的速度就会超过我们的期望。在网络的早期层中,我们想要尽可能多地保留原始输入内容的信息,这样我们就能提取出那些低层的特征。比如说我们想要应用同样的卷积层,但又想让输出量维持为 32 x 32 x 3 。为做到这点,我们可以对这个层应用大小为 2 的零填充(zero padding)。零填充在输入内容的边界周围补充零。如果我们用两个零填充,就会得到一个 36 x 36 x 3 的输入卷。
一般,零填充的格子数可以通过下式计算:
K是过滤器尺寸。运用这个公式,输入输出可以保持一致的空间维度。
PS:补充超参数的概念
超参数:在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。关键的超参数有:
-
学习率:优化算法中更新网络权重的幅度大小,采用哪种学习率取决于所选择优化算法的类型,如SGD、Adam、Adagrad、AdaDelta或RMSProp等算法。
-
迭代次数:迭代次数是指整个训练集输入到神经网络进行训练的次数。当测试错误率和训练错误率相差较小时,可认为当前的迭代次数是合适的,否则需继续增大迭代次数,或调整网络结构。
-
批次大小:在卷积神经网络的学习过程中,小批次会表现得更好,选取范围一般位于区间[16,128]内。CNN网络对批次大小的调整十分敏感。
-
激活函数:激活函数具有非线性,理论上可以使模型拟合出任何函数。通常情况下,rectifier函数在CNN网络中的效果较好。当然,可以根据实际任务,选择其他类型的激活函数,如Sigmoid和Tanh等等。
-
隐层数目:过多计算成本大,慢,达到让训练精度不再上升就可以停止了。
-
隐层单元数:过少会欠拟合(训练样本上误差极大),过多的时候,要采取正确的正则化方式防止过拟合。
-
权重初始化:均匀分布,正态分布。
-
Dropout方法:常见的正则化方法,改善过拟合,默认为0.5。
在我们的卷积层后,存在非线性层,一般我们使用ReLU(修正线性单元)层,目的是给一个在卷积层中刚经过线性计算操作(只是数组元素依次(element wise)相乘与求和)的系统引入非线性特征。非线性激活函数的作用是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题(比如线性不可分的分类问题)。ReLU 层效果好得多,因为神经网络能够在准确度不发生明显改变的情况下把训练速度提高很多(由于计算效率增加)。
ReLU:
CNN的代码(Tensorflow):
定义权重矩阵(卷积核),偏置矩阵,卷积运算,池化运算:
其中padding的含义是填充,具体理解为:
第一层卷积核,偏置项, 池化:
第二层卷积核,偏置项,池化:
全连接层:
完成分类:
训练和评估模型: