大家好,我是讯享网,很高兴认识大家。
没有机器学习的Www.jqbxx.com:机器学习、深度学习算法和技术实战的深度聚合。从今天开始,卷积神经网络将被正式解释。这是曾经让我无论如何都无法理解的事情。主要是名字太“高级”了。网上各种介绍“卷积是什么”的文章特别让人受不了。听了吴恩达的网络课,我豁然开朗,终于明白了这个东西是什么,为什么。我在这里大概会用6~7篇文章来解释CNN,并实现一些有趣的应用。看完之后,大家应该都能自己做自己喜欢的事情了。
一.导言-边界检测
我们来看一个最简单的例子:“边缘检测”。假设我们有这样一张8×8大小的图片:
图中的数字代表这个位置的像素值。我们知道像素值越大,颜色越亮,所以为了举例说明,我们把右边像素小的地方画成深色。图形中间两种颜色的分界线就是我们要检测的边界。
如何检测这个边界?我们可以设计这样一个大小为3×3的过滤器(也称为内核):
然后,我们用这个滤镜来“覆盖”我们的图片,覆盖一个和滤镜一样大的区域,把对应的元素相乘,然后求和。计算完一个区域,再移到其他区域,然后计算,直到覆盖原图的每个角落。这个过程叫做“卷积”。(我们不关心卷积在数学上是指什么,我们只需要知道它在CNN上是怎么计算的。)这里的“动”涉及一个步长。如果我们的步长是1,那么覆盖一个地方后,移动一个格子。很容易知道它总共可以覆盖6×6个不同的区域。
然后,我们将把这些6×6区域的卷积结果拼成一个矩阵:
呃?!你发现了什么?这张图中间亮两边暗,说明我们原图中间的边界在这里体现出来了!
从上面的例子中,我们发现可以通过设计特定的滤波器,并使其与图像卷积,来识别图像中的一些特征,比如边界。上面的例子是检测垂直边界,我们也可以设计一个来检测水平边界,只需将just滤镜旋转90°即可。对于其他功能,理论上只要我们精心设计,总能设计出合适的滤镜。
我们的CNN(对流神经网络),主要是通过一个个滤波器,不断提取特征,从局部特征到整体特征,从而进行图像识别等等。
那么问题来了,怎么才能设计出这么多种滤镜呢?首先,我们不一定知道大推图片需要识别哪些特征。其次,即使知道自己有什么特性,真正设计出相应的滤镜恐怕也不容易。要知道,特征的数量可能有上千个。
其实学习了神经网络之后,我们知道这些滤波器根本不需要我们去设计。每个过滤器中的数字不都是参数吗?我们可以通过大量的数据让机器“学习”这些参数。这是CNN的原则。
二、CNN的基本概念
1 .白色衬垫
从上面的介绍我们可以知道,经过滤波卷积后,原始图像变小了,从(8,8)变成了(6,6)。假设我们再滚动一次,大小变成了(4,4)。
这有什么问题?主要有两个问题:——图像每次卷积都会缩小,以至于几次之后就没了;-与图片中间的点相比,图片边缘的点在卷积中计算的次数更少。这样,边缘信息很容易丢失。
要解决这个问题,可以采用填充法。每次卷积之前,我们在图像周围填充一圈空白色,使卷积后的图像和原来一样大。同时,原边计算次数更多。
比如我们把(8,8)的图片填充到(10,10)里,那么经过(3,3)的滤波后,就是(8,8),不变。
我们把“卷积后保持大小不变”的填充方法称为“相同”方法,没有任何填充的填充方法称为“有效”方法。这是我们在使用一些框架时需要设置的一个超级参数。
2 .步幅大小
在我们前面介绍的卷积中,默认步长为1,但实际上,我们可以将步长设置为其他值。例如,对于(8,8)的输入,我们使用(3,3)的滤波器。如果stride=1,则输出为(6,6);如果stride=2,则输出为(3,3);(这里的例子不是很好,除了连续向下舍入)
3 .游泳池
这种池化是为了提取某个区域的主要特征,减少参数数量,防止模型过拟合。例如,以下MaxPooling采用2×2窗口,并取stride=2:
除了MaxPooling,还有AveragePooling,顾名思义就是取那个区域的平均值。
4.多通道图像的卷积
这个需要单独提一下。彩色图像一般是RGB通道,所以输入数据有三个维度:(长、宽、通道)。比如一张28×28的RGB图片,维数是(28,28,3)。
前面介绍,输入画面是2维(8,8),滤波器是(3,3),输出也是2维(6,6)。
如果输入的图片是三维的(也就是加了一个通道),比如(8,8,3)怎么办?这时我们滤波器的维数会变成(3,3,3),它的最后一个维数应该和输入通道维数一致。此时的卷积是三个通道的所有元素对应相乘后的和,也就是之前9个乘积的和,现在是27个乘积的和。因此,输出的尺寸不会改变。或者(6,6)。
然而,一般来说,我们同时使用太多的滤波器进行卷积。例如,如果我们同时使用四个滤波器,输出维数将变为(6,6,4)。
我特意画了下面这张图来展示上面的过程:
在图中,输入图像是(8,8,3),有四个滤波器,都是(3,3,3),输出是(6,6,4)。我觉得这张图已经画的很清楚了,而且给出了3和4这两个关键数字是怎么来的,就不啰嗦了(这张图花了我至少40分钟)。
事实上,如果我们通过应用我们之前学习的神经网络的符号来看CNN,
我们的输入图片就是X,shape=(8,8,3);4个filters其实就是第一层神金网络的参数W1,,shape=(3,3,3,4),这个4是指有4个filters;我们的输出,就是Z1,shape=(6,6,4);后面其实还应该有一个激活函数,比如relu,经过激活后,Z1变为A1,shape=(6,6,4);
于是,在上图中,我添加了一个激活函数,并用符号标记了相应的部分。就是这样:
这么好的图片值得收藏。
第三,CNN的结构
上面,我们已经知道卷积、池化和填充是如何进行的。接下来,让我们看看CNN的整体结构,它包含三层:
1.卷积层(卷积层- CONV)
它由过滤器和激活功能组成。要设置的一般超参数包括滤波器的数量、大小、步长,以及填充是“有效”还是“相同”。当然也包括选择什么激活功能。
2.池层(池层-池)
没有参数需要我们学习,因为这里所有的参数都是我们自己设置的,不是Maxpooling就是Averagepooling。所需的超级参数包括最大值或平均值、窗口大小和步长。一般我们用Maxpooling,一般取(2,2)的大小,步长为2,这样池化后输入长度和宽度减少2倍,通道保持不变。
3.全连接层(全连接层- FC)
我之前没有讲这个,因为这是我们最熟悉的家伙,我们之前学过的神经网络中最常见的一层,是一排神经元。这一层被称为“全连接”,因为每个单元都与前一层中的每个单元相连接。这里要指定的超参数无非就是神经元的数量和激活函数。
接下来,我们只看一个CNN的外观来对CNN有一些感性认识:
上面的CNN就是我随便拍额头的那个。其结构可以用:x->:conv(relu)->;max pool-& gt;conv(relu)-& gt;FC(relu)-& gt;FC(soft max)-& gt;y来表示。
这里需要说明的是,经过几次卷积和池化,我们最终会将多维数据“扁平化”,即将(高、宽、通道)的数据压缩成一个长为高×宽×通道的一维数组,然后用FC层连接起来。之后就和普通神经网络没什么区别了。
从图中可以看出,随着网络的深入,我们的图像(严格来说,中间的那些不能称为图像,为了方便我们这么说吧)越来越小,但是渠道却越来越大。图中显示的是长方体面对我们的面积越来越小,但长度却越来越长。
四。卷积神经网络与传统神经网络
其实现在回想起来,CNN和我们之前学的神经网络并没有太大的区别。传统的神经网络实际上是多个FC层的叠加。CNN无非是把FC换成了CONV和POOL,也就是把传统的由神经元组成的层换成了由滤波器组成的层。
那么,为什么要这样改变呢?有什么好处?具体有两点:
1.参数共享机制(参数共享)
让我们比较一下传统神经网络的层和由滤波器组成的CONV层:假设我们的图像大小为8×8,即64个像素,假设我们使用9个单元的全连通层:
这一层需要多少参数?需要64×9 = 576个参数(先不考虑偏置项B)。因为每个环节都需要一个权重w。
然后,让我们看看同样有9个单元的过滤器是什么样的:
其实不用看也知道几个单元只有几个参数,所以一共9个参数!
因为,对于不同的区域,我们都共享同一个滤波器,所以我们共享同一套参数。这也是合理的。从前面的解释中我们知道,过滤器是用来检测特征的。该特征通常可能出现在不止一个地方,例如“垂直边界”,并且它可能出现在不止一个画面中。因此,我们共享同一个过滤器不仅是合理的,而且是应该的。
可以看出,参数共享机制大大减少了我们网络中的参数数量。这样,我们可以用更少的参数训练出更好的模型,通常事半功倍,并且可以有效避免过拟合。同样,由于filter的参数是共享的,所以即使图像发生平移,我们仍然可以识别特征,这就是所谓的“平移不变性”。因此,该模型更加稳健。
2.连接的稀疏性
根据卷积运算,输出图像中的任何单元仅与输入图像的一部分相关:
但在传统的神经网络中,由于都是全连接的,所以任何一个输出单元都会受到所有输入单元的影响。这样会无形中降低图像的识别效果。相比较而言,每个地区都有自己独特的特点,我们不希望它受到其他地区的影响。
正是这两大优势,使得CNN超越了传统的NN,开启了神经网络的新时代。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/27818.html