初识CNN

读研以来不断地说机器学习,但是机器学习究竟是什么还是不清楚,直到老师要自己讲机器学习算法,我又正好抽到卷积神经网络和循环神经网络,研究了很久,有了些个人的体会,如今写下这篇博文,希望可以对大家起到一个抛砖引玉的作用。本文的写成引用和参考了很多大佬的心得体会,作者只是站在他们的肩膀上进行了一次总结,在这里先向大佬们表达诚挚的谢意和敬意,引用的部分我会注明。话不多说,开讲啦!

首先最需要明确的一点就是,卷积神经网络,也就是convolutional neural networks (简称CNN),现在已经被用来应用于各个领域,物体分割啦,风格转换啦,自动上色啦blahblah,但是!!CNN真正能做的,只是起到一个特征提取器的作用!所以这些应用,都是建立在CNN对图像进行特征提取的基础上进行的。

这篇文章呢,我不打算和传统介绍CNN的文章一样先介绍生物神经元、突触什么的,就直接从最简单的实例讲起。不过如果你想真正的深入理解什么是CNN,我建议你先看看下面的这三篇,打个神经网络的基础。本文只是给大家说明什么是CNN。
零基础入门深度学习(1) - 感知器
零基础入门深度学习(2) - 线性单元和梯度下降
零基础入门深度学习(3) - 神经网络和反向传播算法

1、引言


image

image

这里可以扯出机器学习中听起来很高冷的名词 “ 欠拟合 ”
那么什么是“欠拟合”呢?举个通俗的例子:
你想让神经网络(简称神经)辨认猫和狗(算法类型为分类)。于是给它看一百万只狗,和一百万只猫,每只狗的脑门上都贴着“我是狗”的字条,猫则贴“我是猫”【使用标注数据】。神经同时看五十万只禽兽,分四批看,并作出判断【实现时用并行处理,使用mini-batch】。每个看到的猫或狗,如果判断错了,就修正自己的判断标准【优化】。每看完这二百万只禽兽算一轮,每学十轮就看一些之前完全没见过的猫猫狗狗做出判断【推广性测试】。然后呢,你发现给神经看的猫狗图片太少,神经不能很好地判断某些猫狗特征都有的动物(兔子,耳廓狐说的就是你)【欠拟合】,于是追加猫和狗的图片各一百万只。当神经刻苦学习猫狗知识的时候,你正在睡觉,一觉睡醒,发现神经一小时前判断猫和狗比较准【次最优解】,现在学太多反而判断不准了【过拟合】,于是你让神经使用一小时前的标准【防止过拟合技巧之early-stopping】。这样训练过程就结束了。
接下来扯回来,回到正题。
我们都知道,图片在计算机内部以像素值的方式被存储,也就是说两张X在计算机看来,其实是这样子的。


image

image

其中1代表白色,-1代表黑色。
有个动图帮助理解


image

图像在计算机中是一堆按顺序排列的数字,数值为0到255。0表示最暗,255表示最亮。
如果按照每像素逐个比较肯定是不科学的,结果不对而且效率低下,因此提出其他匹配方法。

我们称之为patch匹配。

观察这两张X图,可以发现尽管像素值无法一一对应,但也存在着某些共同点。


image

如上图所示,两张图中三个同色区域的结构完全一致!

因此,我们就考虑,要将这两张图联系起来,无法进行全体像素对应,但是否能进行局部地匹配?

答案当然是肯定的。


image

我们发现只要用这三个feature便可定位到X的某个局部。


image

feature在CNN中也被成为卷积核(filter),一般是3X3,或者5X5的大小。

2、卷积计算

终于到卷积计算了!怎么计算呢?很简单,四个字:
对 应 相 乘
看下图。

取 feature里的(1,1)元素值,再取图像上蓝色框内的(1,1)元素值,二者相乘等于1。把这个结果1填入新的图中。


image

image

同理再继续计算其他8个坐标处的值


image

9个计算完成


image

接下来的工作是对右图九个值求平均,得到一个均值,将均值填入一张新的图中。

这张新的图我们称之为 feature map (特征图)


image

image

不太明白没关系,有个直观的动图助你理解:


image

明白了吧,好了,经过一系列卷积对应相乘,求均值运算后,我们终于把一张完整的feature map填满了。


image

feature map是每一个feature从原始图像中提取出来的“特征”。其中的值,越接近为1表示对应位置和feature的匹配越完整,越是接近-1,表示对应位置和feature的反面匹配越完整,而值接近0的表示对应位置没有任何匹配或者说没有什么关联。

一个feature作用于图片产生一张feature map,对这张X图来说,我们用的是3个feature,因此最终产生3个 feature map。


image

卷积就介绍到这里啦,想要具体了解的,请参考这位大神的:
什么是卷积
卷积层是如何提取特征的

3、非线性激活层

为什么是非线性激活层呢?在前面的介绍里,我们可以看出来其运算过程都是一个线性过程,线性过程的可变性太低。对于神经网络来说,需要具有一定的弹性以适用于各种数据集的变化。怎么让其具有弹性呢?很简单,加入非线性因子就好,非线性因子是不确定的,因而让神经网络具有了可变性,这也就是为什么需要非线性激活层的一个原因。术语说加入非线性增强模型的拟合能力。

在神经网络中用到最多的非线性激活函数是Relu函数,它的公式定义如下:

f(x)=max(0,x)

即,保留大于等于0的值,其余所有小于0的数值直接改写为0。

为什么要这么做呢?上面说到,卷积后产生的特征图中的值,越靠近1表示与该特征越关联,越靠近-1表示越不关联,而我们进行特征提取时,为了使得数据更少,操作更方便,就直接舍弃掉那些不相关联的数据。


image

image

得到非线性激活函数作用后 的结果:


image

4、池化

卷积操作后,我们得到了一张张有着不同值的feature map,尽管数据量比原图少了很多,但还是过于庞大(比较深度学习动不动就几十万张训练图片),因此接下来的池化操作就可以发挥作用了,它最大的目标就是减少数据量。

池化分为两种,Max Pooling 最大池化、Average Pooling平均池化。顾名思义,最大池化就是取最大值,平均池化就是取平均值。

拿最大池化举例:选择池化尺寸为2x2,因为选定一个2x2的窗口,在其内选出最大值更新进新的feature map。


image

最终得到池化后的feature map。可明显发现数据量减少了很多。

如果不好理解,可以看看这张动图:


image

因为最大池化保留了每一个小块内的最大值,所以它相当于保留了这一块最佳匹配结果(因为值越接近1表示匹配越好)。这也就意味着它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。这也就能够看出,CNN能够发现图像中是否具有某种特征,而不用在意到底在哪里具有这种特征。这也就能够帮助解决之前提到的计算机逐一像素匹配的死板做法。

在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。

5、全连接层

到这里就介绍了CNN的基本配置—卷积层、Relu层、池化层。

在常见的几种CNN中,这三层都是可以堆叠使用的,将前一层的输入作为后一层的输出。比如:


image

接下来就是全连接层的登场了,什么作用呢?

连接所有的特征,将输出值送给分类器(如softmax分类器)。

这个softmax分类器是非常重要的函数,它是一个分类函数,输出的是每个对应类别的概率值。比如:

【0.5,0.03,0.89,0.97,0.42,0.15】就表示有6个类别,并且属于第四个类别的概率值0.89最大,因此判定属于第四个类别。

全连接层要做的,就是对之前的所有操作进行一个总结,给我们一个最终的结果。

它最大的目的是对特征图进行维度上的改变,来得到每个分类类别对应的概率值。

注意:本例中因为只有两个类别X和O,而且数据量到此已经非常少了,因此直接将三个特征图改变维度直接变成一维的数据。(相当于全连接层的每个参数均为1)


image

展开的数据即为属于类别X的概率值,值大小也在对应X的线条粗细中表现出来了。

以上所有的操作都是对标准的原图X来进行的,因此最终分类显示即为X毋庸置疑。

假设对一张看起来并不标准的图进行分类。如下


image

假设进行一系列操作后,得到的概率值如下所示:


image

0.9表示极其大可能是X,因此对应到X的黄色线条比对应到O的绿色线条要粗很多很多。

我们对结果进行统计分析后可判断这张图片里的字母为X。

至此,我们在把此前所讲的串起来看一看是怎么回事:


image

6、CNN的训练

介绍完了CNN以后,就要说明一下怎么训练了。这方面涉及到大量的数学知识,小编只是为大家讲解CNN是怎么回事,想要深入研究请戳传送门:自己手写一个卷积神经网络

至此,CNN的讲解也就告一段落。主要是应用,会接着写博讲解。在这里致敬和感谢知乎答主:沉迷学习的糕糕,感谢他的卷积神经网络CNN完全指南终极版这篇专栏文章,奠定了文章的基础,再次表示深深的致谢。

作者:NTUhuihui
来源:CSDN
原文:https://blog.csdn.net/NTUhuihui/article/details/78932038
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(初识CNN)