欢迎光临散文网 会员登陆 & 注册

卷积神经网络(CNN)基本原理详解(无数学公式版本)

2023-03-28 20:08 作者:谨月拾  | 我要投稿

首先要明确,卷积神经网络【CNN】(以下用CNN代称)设计的初衷是为了让计算机处理和识别图像,目前应用于几乎所有的涉及机器视觉的领域,它基于提取特征,特征匹配的原理,来识别图像或者其他任何能够转化成计算机可认读数据的事务。

首先,CNN的基本运行过程如下图所示,这里我们以【识别X和O】为例


我们输入一个图片【二维】交给CNN,由CNN自己运算和识别图片内容,最后给出一个结果,此时对于我们来说,CNN的运算过程是黑盒(即我们并不清楚CNN到底运算出了怎样的结果,又是基于什么标准判断出来的)我们只能判断CNN给出的结果正确与否。


对于图像识别,我们要求它的精准度高,

鲁棒性强(物体在受到干扰时仍保持自身性质不变的特性)

例如上图,不论图片是平移,缩放,旋转,加粗,都不应该影响CNN最后得出的结果,但是这对于人类来讲很容易,可是计算机只能识别数字,对于计算机而言,变化之后的两个图像是两个不相同的矩阵,计算机该如何识别?

我们参考人脑识别物体的原理,即基于物体特征的识别,CNN的原理便是如此,这里为了讲解方便我们以识别X为例,图片是黑白图片(即单通道,彩色图片是RGB三通道)

我们不难发现,X具有三个明显的特征,

一、自左上向右下的斜线(图中绿色框标出的)

二、自左下向右上的斜线(图中紫色框标出的)

三、中间的 “ × ” 形(图中橙色框标出)

那么我们很容易想到,让CNN学习这三个特征,只要图片内容符合这三个特征,就把这张图片识别为【X】。

我们把这些特征提取出来,以矩阵的形式表示,我们就把这些 “ 特征 ” 叫做卷积核,一般我们选择的卷积核大小为3x3。

(ps:在实际应用中,卷积核是由CNN自学习得来,或者由科学家预训练得到,这里为了讲解方便,我们指定了以上三个卷积核)


接下来就是计算的第一步:卷积。


这一步操作,用卷积核与图片对应的区域相乘,如果卷积核与图片对应的区域完全相符,我们很容易计算,这时得到的矩阵是全1矩阵

我们将矩阵中各项的值求和,或者求和之后求平均,这里我们采用求和之后求平均的方法,显然结果为1

如果与图像的其他部分相乘,显然结果是不同的

3x3的卷积核从图像的左上角开始进行计算,一个像素块一个像素块移动(移动的距离称为【步数】可自行设置,一般采用1或2)边缘不够3x3的采用补0或其他方法,将整个图片扫描完成之后,生成一个特征图(feature map)称为【特征图样】

可以看到,右边的特征图样基本保留了图像中与卷积核相对应的特征,这里是向右下斜线的卷积核,得出的特征图样也基本保留了向右下的特征。

经过三个卷积核的计算,我们得到了如下的三个特征图样,可以看到,基本保留了相应的特征

ps:如果图像并不具有卷积核所对应的特征,得出的特征图样是无规律的

在第一步卷积之后,就是运行触发函数了,目前普遍采用的是ReLU函数(Rectified Linear Units 线性重整单元)其作用是将特征矩阵中小于0的值(即负值)置0。方便之后矩阵相关的运算。

前面我们说了,图像识别要求高精度,但同时也要求低时延,这里就有一个问题,我们只输入了一个【x】的图像,在第一步卷积完成之后,生成了三个图像,在之后要对这三个图像进行运算,计算量变成了三倍!

而在实际的应用中,卷积核的数量很多,图像也并非是黑白的,计算负担会非常大,甚至是在第一步卷积之后就接近百倍甚至百万倍的计算量。

而为了解决这一问题,便有了【池化】又叫 “ 下采样 ”(pooling)这一步。

先看下图,我们把图中偶数列和偶数行的像素去掉,并不影响人类识别这是一只鸟,因为图片的特征还在,只是变得模糊而已

基于这样的原理,我们对卷积过后的特征图样进行池化。这里的池化并不会影响最终的结果,因为CNN的判断是基于特征的,只要将特征保留下来即可,池化反而可以有效的减少计算量。

通常我们有两种池化方法,分为最大池化和平均池化,基本原理是用一个值来代表一片区域特征,最大池化和平均池化顾名思义,不再赘述。

池化之后我们得到的特征图样就被缩小了,但仍然保留了明显的特征,(这里采用最大池化)

前面提到的三步,卷积运算,ReLU函数,池化,是可以叠加的,一般的,每一次卷积运算之后都要进行ReLU和池化,在多次运算之后,我们会得到这样的简洁但特征明显的特征图样

之后进行最后一步,【全相连】,在这一步中,我们将得到的所有特征图样变换为一维向量,并且每一个向量都有其各自的权重,注意,这里的权重是CNN通过自学习和科学家的调参所得。

将每一个向量的值与其权重相乘并求和,注意:(计算得出的向量值是如图所示的,一张图片计算出来一个值,而权重是不同的,CNN会将X的权重表带入到如图的向量值中计算,再将O的权重表带入到如图的向量值中计算,并判断谁的概率更大,即为最终结果)

如上图所示是X的权重表,可见在向量值为1的位置X的权重表权重较大,故计算出X的概率更大,判断图像为X

至此,CNN的运算过程就结束了,在实际应用中,采用多层卷积和多层全相联模型,一个完整的CNN过程如下

这里就有很多的问题出现了,你怎么知道卷积核如何选择?选多少卷积核?选多大的卷积核?就拿人脸来说,你怎么知道选哪些特征就能让机器成功识别呢,最后全相联时候的权重又是哪里来的呢?

这时候就要介绍【反向传播算法】(Backpropagation)用来优化卷积神经网络的结果。

在具体介绍这个算法之前,先要了解一个名词【损失函数】,例如你给CNN一张狗的图片,而它得出的结果却是猫,在CNN计算结果中,对这两者之间的误差进行一个计算,得到【损失函数】,我们用数学分析这个函数,对它求导,通过不断地实验,训练,调参,使得损失函数降到最低。

上图,是一个误差率的计算,假设输入的图片本身就是X,CNN判断它有0.92概率是X,那么就有0.08的误差;输入的图片不是O,CNN计算有0.51的可能是O,误差就是0.51,将他们加和得到一个总的误差值0.59。

注意:这里只是计算误差值,并非说明损失函数就是如此计算的


为什么采用反向而不是正向呢?我们都知道,CNN的运算过程是及其复杂的,它在运算中提取出的特征是我们所不可见的,而且人类是无法理解的,第一步中的一个特征图样很可能影响到了下一步中几百万个特征图样的结果,正向调整难度很大,调整之后影响可能很小,也可能非常大,所以我们采用反向传播来优化机器计算结果。

例如,你给CNN一张狗的图片,但是它计算出来的结果是猫,这时候就要人为的去修改最后一步全相联中的参数,让机器的误差尽可能小,并通过对权重的调整,继而反馈到前面的计算结果的权重,这个反馈的过程是由卷积神经网络的自学习功能完成的,通过不断地训练,CNN自己就会知道采用哪些卷积核,哪些参数可以得到最优结果,这也是卷积神经网络厉害的地方,机器具有学习功能。

本篇文章只作为学习笔记,若有错误的地方还请各位指正。

卷积神经网络(CNN)基本原理详解(无数学公式版本)的评论 (共 条)

分享到微博请遵守国家法律