深入浅出理解卷积Convolutional原理和深度学习过程中CNN神经网络机理
深入浅出理解卷积Convolutional原理和深度学习过程CNN神经网络机理
2维卷积是相当简单的操作:从卷积核(1通道时即为典型滤波器)开始,这是一个小的权值矩阵。这个卷积核在2维输入数据上滑动,对当前输入的部分元素进行矩阵乘法,然后将结果汇为单个输出像素。
卷积核重复这个计算转换过程遍历(神经感知)了整张图片,把一个二维矩阵转换为另一个二维矩阵。输出特征实质上是在输入数据相同位置上的加权和(权值是卷积核本身的值)
输入数据是否落入这个大致相似区域,直接决定了数据经过卷积核后的输出。这意味着卷积核的尺寸直接决定了生成新的二维特征矩阵时形成多少个输入特征。
这与全连接层完全相反。在上面的例子中,输入(input)特征为 5*5=25,输出数据为 3*3=9. 如果使用标准的全连接层,就会产生一个 25*9=225 个参数的权值矩阵,每个输出都是所有输入数据的加权求和。卷积操作允许只用9个参数(权值)来实现这种变换,每个输出特征不用感知每个输入特征,而是只是感知来自大致相同区域的输入特征。请特别注意这一点,这一点对整个卷积神经网络至关重要。
卷积过程中常用的技术:Padding 和 Strides
Padding:看上面的gif动图演示卷积过程,会注意到在卷积核滑动过程中, 5*5特征矩阵被转换为3*3的特征矩阵。但是,边缘上的像素永远不在卷积核的中心,因为卷积核没有办法扩展滑动到边缘之外。这并不是很理想,对此改进,希望输出的尺寸等于输入。
Padding用了非常机智的方法解决这个问题:用额外的“假”像素(通常值为0,因此经常使用的术语是:0填充)填充边缘地带。这样,在卷积过程的滑动中,卷积核就可以滑动到原始边缘像素,使其位于其中心,卷积核完美的延伸到边缘之外的假像素(0填充像素),从而生成与输入相同大小的输出。
Striding:卷积时,通常希望输出的尺寸是比原输入更低。这在CNN中很常见,在增加信道数量的同时空间尺寸减小。其中一种方法是使用池化层(例如,取每 2×2网格的平均值/最大值将空间维度减半)。还有一种方法是使用 Strides:
Strides的思路是改变卷积核移动的步长跳过一些像素。Stride 是 1 表示卷积核滑过每一个相距是 1 的像素,是最基本的单步滑动,即经典的标准卷积模式。Stride 是2表示卷积核的移动步长是2,跳过相邻像素,图像缩小为原来的1/2。Stride是3表示卷积核的移动步长是 3,跳过2个相邻像素,图像缩小为原来的1/3。
越来越多的新型神经网络结构,已完全抛弃了池化层。当需要对图像进行缩小时会采用 Stride方法。
多通道
上面所述基于单个输入通道的图像。实际上,现在绝大多数输入图像都是3通道的,一张彩色图片由R、G、B三个维度的值表述。通道数只会增加网络深度。通常会将图像的通道视作一个整体,强调其整体的一面而不关注各自的差异。
滤波器:卷积核的集合
滤波器和卷积核两个术语之间有着本质的区别:仅在1通道情况下,滤波器和卷积核这两个术语等价,在一般情况下,它们是不同的。每个滤波器实际上是卷积核的集合,图层的每个输入通道都有一个卷积核,并且是唯一的。
卷积层中的每个滤波器都只输出一个通道,他们是这样实现的:
滤波器的每个卷积核在各自的输入通道上滑动,产生各自的计算结果。一些卷积核可能比其他卷积核具有更大的权重,以便比某些卷积核更强调某些输入通道(例如,滤波器的红色通道卷积核可能比其他通道的卷积核有更大的权重,因此,对红色通道特征的反应要强于其他通道)。
然后将每个通道处理的结果汇在一起形成一个通道。滤波器的卷积核各自产生一个对应通道的输出,最后整个滤波器产生一个总的输出通道。
偏置。偏置的作用是对每个输出滤波器增加偏置项以便产生最终输出通道。
其他数量滤波器的生成,都和单滤波器相同:每个滤波器使用不同的卷积核集合和具有上述过程的标量偏差项来处理输入数据,最终产生一个输出通道。然后将它们连接在一起以产生总输出,其中输出通道的数量是过滤器的数量。在输出数据送入另一个卷积层之前,通常还要应用非线性**函数。重复上述操作即可完成网络的搭建。
局部性
卷积核只从一个小的局部区域组合像素来形成输出。也就是说,输出特性只从一个小的局部区域感知输入特性。
卷积核被应用于整个图像,以产生输出矩阵。
所以随着反向传播从网络的分类节点一路过来,卷积核拥有一个有趣的任务,从局部输入中学习权值,生成特征。此外,因为卷积核本身被应用于整个图像,卷积核学习的特征必须足够通用,可以来自于图像的任何部分。像素总是以一致的顺序出现,而且附近的像素互相影响。例如,如果某像素附近所有像素都是红色的,那么该像素极有可能也是红色的。如果有偏差,这是一个有趣的反常现象,可以转化成一个特征,所有这些偏差可以通过与周围像素的比较检测出来。
feature maps特征图
特征图其实就是CNN中的每张图片,都可称之为特征图。在CNN中,要训练的卷积核并不是仅仅只有一个,这些卷积核用于提取特征,卷积核个数越多,提取的特征越多,理论上来说精度也会更高,然而卷积核一堆,意味着要训练的参数的个数越多。CNN的每一个卷积层都要人为的选取合适的卷积核个数,及卷积核大小。每个卷积核与图像进行卷积,就可以得到一张特征图,比如LeNet-5经典结构中,第一层卷积核选择了6个,我们可以得到6个特征图,这些特征图也就是下一层网络的输入。也可以把输入图片看成一张特征图,作为第一层网络的输入。
三维卷积
上述讨论均基于灰度图像,也就是二维矩阵,那么在彩色RGB图像上如何卷积呢?
彩色图像如果是 6×6×3,这里的 3 指的是三个颜色通道,你可以把它想象成三个6×6 图像的堆叠。为了检测图像的边缘或者其他的特征,不是把它跟原来的 3×3 的过滤器做卷积,而是跟一个三维的过滤器,它的维度是 3×3×3,这样这个过滤器也有三层,对应红绿、蓝三个通道。
这里的第一个 6 代表图像高度,第二个6代表宽度,这个 3 代表通道的数目。同样你的过滤器也有一个高,宽和通道数,并且图像的通道数必须和过滤器的通道数匹配,所以这两个数(紫色方框标记的两个数)必须相等。
为了计算这个卷积操作的输出,要做的就是把这个 3×3×3 的过滤器先放到最左上角的位置,这个3×3×3的过滤器有27个数,27个参数就是3的立方。依次取这27个数,然后乘以相应的红绿蓝通道中的数字。先取红色通道的前9个数字,然后是绿色通道,然后再是蓝色通道,乘以左边黄色立方体覆盖的对应的27个数,然后把这些数都加起来,就得到了输出的第一个数字。
如果要计算下一个输出,把这个立方体滑动1个单位,再与这 27 个数相乘,把它们都加起来,就得到了下一个输出,以此类推。
单层卷积神经网络
与卷积过程相比较,卷积神经网络的单层结构多了**函数和偏移量。
假设有10个过滤器,神经网络的一层是3x3x3 ,那么,这一层有几个参数?
每一层都是一个3x3x3 矩阵,因此每个过滤器都有27个权重参数,也就是27个数,再加上一个偏差,总共有28个,然后一共有10个过滤器,则全部参数的总和为 28x10=280 个,也就是280个参数。
传统计算机视觉的卷积,一般来说,这个卷积核(过滤器)是已知的,比如边缘检测算子、高斯模糊等,都是已知的卷积核,然后再与图像进行卷积运算。然而深度学习中的卷积核是未知的,训练一个神经网络,就是要训练得出这些卷积核,而这些卷积核就相当于单层卷积核的权值,因此可把这些待学习的卷积核每个权值看成是神经网络的训练参数。
不论输入图片有多大,1000×1000也好,5000×5000也好,参数始终都是280 个。用这10个过滤器来提取特征,如垂直边缘,水平边缘和其它特征。即使这些图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作“避免过拟合”。即选定过滤器组后,参数的数目与输入图片的尺寸无关。因此,卷积神经网络的参数相较于标准神经网络来说要少得多,这是 CNN 的优点之一。
池化层
池化,简单的说就是图片下采样。卷积神经网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。Pooling层主要的作用是采样,去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。池化的另一个作用是防止过拟合。
一个最大池化层:
MaxPooling2D(pool_size, strides, padding)
pool_size: 指定池化窗口高度和宽度的数字
strides: 垂直和水平 stride。如果不指定任何值,则 strides 默认为 pool_size
padding: 选项包括 valid 和 same。如果不指定任何值,则 padding 设为 valid
在卷积层后面添加最大池化层,降低卷积层的维度。假设卷积层的大小是 (100, 100, 15),希望最大池化层的大小为 (50, 50, 15)。要实现这一点,可以在最大池化层中使用 2x2 窗口,stride 设为 2,代码如下:
MaxPooling2D(pool_size=2, strides=2)
采用较多的一种池化过程叫做最大池化(Max Pooling)。将输入拆分成不同的区域,输出的每个元素都是对应区域中元素的最大值,如下图所示:
池化过程类似于卷积过程,上图所示的池化过程中相当于使用了一个大小f=2的滤波器,且池化步长s=2。卷积过程中的几个计算大小的公式也都适用于池化过程。如果有多个通道,那么就对每个通道分别执行计算过程。
此例是计算 3×3 输出的每个元素,我们看左上角这些元素,注意这是一个3×3区域,因为有 3 个过滤器,取最大值 9。然后移动一个元素,因为步幅是 1,蓝色区域的最大值是9.继续向右移动,蓝色区域的最大值是 5。然后移到下一行,因为步幅是 1,我们只向下移动一个格,所以该区域的最大值是 9。这个区域也是 9。这两个区域的最大值都是 5。最后这三个区域的最大值分别为 8,6 和 9。超参数 f=3,s=1,最终输出如图所示:
对最大池化的一种直观解释是,元素值较大可能意味着池化过程之前的卷积过程提取到了某些特定的特征,池化过程中的最大化操作使得只要在一个区域内提取到某个特征,它都会保留在最大池化的输出中。但是,没有足够的证据证明这种直观解释的正确性,而最大池化被使用的主要原因是它在很多实验中的效果都很好。
重点是池化层不参与权重更新,也就是说它是一组超参数,由人为设定好的一组数值,一旦确定了,它就是一个固定运算,梯度下降无需改变任何值,而且一般情况不对池化层使用padding操作。
另一种池化过程是平均池化(Average Pooling),就是从取某个区域的最大值改为求这个区域的平均值:
卷积神经网络CNN构建
该卷积神经网络的参数:
有几点需要注意:
第一,池化层和最大池化层没有参数;
第二,卷积层的参数相对较少,前面也提到过,其实许多参数都存在于神经网络的全连接层。随着神经网络的加深,**值尺寸会逐渐变小,如果**值尺寸下降太快,也会影响神经网络性能。
随着神经网络深度的加深,高度和宽度通常都会减少,从 32×32 到 28×28,到 14×14,到 10×10,再到 5×5。所以随着层数增加,高度和宽度都会减小,而通道数量会增加,从 3 到 6 到 16 不断增加,然后得到一个全连接层。
构建深度卷积的模式:
随着网络的深入,提取的特征图片大小将会逐渐减小,但同时通道数量应随之增加;
常见模式就是一个或多个卷积后面跟随一个池化层,然后一个或多个卷积层后面再跟一个池化层,然后是几个全连接层,最后是一个 softmax。
Conv——Pool——Conv——Pool—— ……多个(Conv-Pool)… ——Fc——Fc——Fc——softmax。
附录:
《人工智能Artificial Intelligence中卷积神经网络Convolutional Neural Network基本原理综述》https://blog.****.net/zhangphil/article/details/78773649