㈠ 卷积神经网络用全连接层的参数是怎么确定的
卷积神经网络用全连接层的参数确定:卷积神经网络与传统的人脸检测方法不同,它是通过直接作用于输入样本,用样本来训练网络并最终实现检测任务的。
它是非参数型的人脸检测方法,可以省去传统方法中建模、参数估计以及参数检验、重建模型等的一系列复杂过程。本文针对图像中任意大小、位置、姿势、方向、肤色、面部表情和光照条件的人脸。
输入层
卷积神经网络的输入层可以处理多维数据,常见地,一维卷积神经网络的输入层接收一维或二维数组,其中一维数组通常为时间或频谱采样;二维数组可能包含多个通道;二维卷积神经网络的输入层接收二维或三维数组;三维卷积神经网络的输入层接收四维数组。
由于卷积神经网络在计算机视觉领域应用较广,因此许多研究在介绍其结构时预先假设了三维输入数据,即平面上的二维像素点和RGB通道。
㈡ 卷积神经网络CNN(Convolutional Neural Network)
上图计算过程为,首先我们可以将右边进行卷积的可以称为过滤器也可以叫做核,覆盖到左边第一个区域,然后分别按照对应位置相乘再相加,3*1+1*1+2*1+0*0+0*0+0*0+1*(-1)+8*(-1)+2*(-1)=-5;
按照上述的计算方法逐步按右移一个步长(步长可以设定为1,2,...等),然后按往下移,逐渐计算相应的值,得出最终的值。
如上图显示,对于第一个图像矩阵对应的图,一边是白色,一边是黑色,那么中间就会存在一个垂直的边缘,我们可以选择一个垂直边缘检测过滤器,如乘法右边的矩阵,那么两者做卷积后得出的图会显示如等号右边的结果矩阵对应的灰度图中间会有一个白色的中间带,也就是检测出来的边缘,那为什么感觉中间边缘带会比较宽呢?而不是很细的一个局域呢?原因是我们输入的图像只有6*6,过于小了,如果我们选择输出更大的尺寸的图,那么结果来说就是相对的一个细的边缘检测带,也就将我们的垂直边缘特征提取出来了。
上述都是人工选择过滤器的参数,随着神经网络的发展我们可以利用反向传播算法来学习过滤器的参数
我们可以将卷积的顾虑器的数值变成一个参数,通过反向传播算法去学习,这样学到的过滤器或者说卷积核就能够识别到很多的特征,而不是依靠手工选择过滤器。
- padding 操作,卷积经常会出现两个问题:
1.每经过一次卷积图像都会缩小,如果卷积层很多的话,后面的图像就缩的很小了;
2.边缘像素利用次数只有一次,很明显少于位于中间的像素,因此会损失边缘图像信息。
为了解决上述的问题,我们可以在图像边缘填充像素,也就是 padding 操作了。
如果我们设置在图像边缘填充的像素数为p,那么经过卷积后的图像是:(n+2p-f+1)x(n+2p-f+1).
如何去选择p呢
通常有两种选择:
-Valid:也就是说不填充操作(no padding),因此如果我们有nxn的图像,fxf的过滤器,那么我们进行卷积nxn fxf=(n-f+1)x(n-f+1)的输出图像;
-Same:也就是填充后是输出图像的大小的与输入相同,同样就有(n+2p)x(n+2p) fxf=nxn,那么可以算,n+2p-f+1=n,得到p=(f-1)/2。
通常对于过滤器的选择有一个默认的准则就是选择过滤器的尺寸是奇数的过滤器。
- 卷积步长设置(Strided COnvolution)
卷积步长也就是我们进行卷积操作时,过滤器每次移动的步长,上面我们介绍的卷积操作步长默认都是1,也就是说每次移动过滤器时我们是向右移动一格,或者向下移动一格。
但是我们可以对卷积进行步长的设置,也就是我们能够对卷积移动的格数进行设置。同样假如我们的图像是nxn,过滤器是fxf,padding设置是p,步长strided设置为s,那么我们进行卷积操作后输出的图像为((n+2p-f)/s+1)x((n+2p-f)/s+1),那么这样就会出现一个问题,如果计算结果不是整数怎么办?
一般是选择向下取整,也就是说明,只有当我们的过滤器完全在图像上能够覆盖时才对它进行计算,这是一个惯例。
实际上上述所述的操作在严格数学角度来说不是卷积的定义,卷积的定义上我们计算的时候在移动步长之前也就是对应元素相乘之前是需要对卷积核或者说我们的过滤器进行镜像操作的,经过镜像操作后再把对应元素进行相乘这才是严格意义上的卷积操作,在数学角度上来说这个操作不算严格的卷积操作应该是属于互相关操作,但是在深度学习领域中,大家按照惯例都省略了反转操作,也把这个操作叫做卷积操作
我们知道彩色图像有RGB三个通道,因此对于输入来说是一个三维的输入,那么对三维输入的图像如何进行卷积操作呢?
例子,如上图我们输入图像假设为6×6×3,3代表有RGB三个通道channel,或者可以叫depth深度,过滤器的选择为3×3×3,其中需要规定的是,顾虑器的channel必须与输入图像的channel相同,长宽没有限制,那么计算过程是,我们将过滤器的立体覆盖在输入,这样对应的27个数对应相乘后相加得到一个数,对应到我们的输出,因此这样的方式进行卷积后我们得出的输出层为4×4×1。如果我们有多个过滤器,比如我们分别用两个过滤器一个提取垂直特征,一个提取水平特征,那么输出图4×4×2 。也就是代表我们输出的深度或者说通道与过滤器的个数是相等的。
第l层的卷积标记如下:
加入我们的过滤器是3×3×3规格的,如果我们设定10个过滤器,那么需要学习的参数总数为每个过滤器为27个参数然后加上一个偏差bias那么每个过滤器的参数为28个,所以十个过滤器的参数为280个。从这里也就可以看出,不管我们输入的图片大小是多大,我们都只需要计算这些参数,因此参数共享也就很容易理解了。
为了缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们经常会使用池化层。池化层的计算方式与卷积类似,只是我们需要对每一个通道都进行池化操作。
池化的方式一般有两种:Max Pooling和Average Pooling。
上面为Max Pooling,那么计算方法与卷积类似,首先设定超参数比如过滤器的大小与步长,然后覆盖到对应格子上面,用最大值取代其值作为输出的结果,例如上图为过滤器选择2×2,步长选择为2,因此输出就是2×2的维度,每个输出格子都是过滤器对应维度上输入的最大值。如果为平均池化,那么就是选择其间的平均值作为输出的值。
因此从上面的过程我们看到,通过池化操作能够缩小模型,同时能让特征值更加明显,也就提高了提取特征的鲁棒性。
㈢ 卷积神经网络(Convolutional Neural Networks, CNN)——更有效率地提取特征
卷积神经网络(Convolutional Neural Networks, CNN)——更有效率地提取特征
图像识别问题本质上就是分类问题,比如我们要区分猫和狗,那么我们就需要构建一个模型,将照片丢进去后,模型能输出猫或者狗的概率有多大。在做图像识别时首要的就是要提取图片的特征,那么如何提取图片的特征呢?前面讲到了前向全连接网络,我们可以尝试用前向全连接网络提取。假设图片的像素是100*100,如果如片是彩色的,每个像素都有RGB三种颜色的数值。因此,一张图片是有一个三维向量构成的,一维是长100,一维是宽100,还有一维是R、G、B 3个通道(channels)。把这个三维向量拉直作为一个一维向量,长度就是100*100*3。
我们在区分一张图片时,我们观察的往往是图片的局部的、最重要的特征。 比如图片上是一只鸟,我们可能通过嘴巴、眼睛、爪子等就可以判断出是一只鸟了。因此,输入层的每一个神经元没有必要看图片的全局,只需要看一个局部就行了。
在两张不同的图片上,同一个特征区域可能处于不同位置。 比如鸟嘴的局部特征区域在下面这两张图上就处在不同的位置上。那么如何才能让两个不同的神经元在看到这两个不同的感受野时,能产生一致的特征值呢?
对上面的内容进行一个总结:
(1)我们设置一个局部感受野,假设感受野的大小为W*H*C,其中W表示感受野的宽度,H表示感受野的高度,C表示感受野的通道数。那么对应的神经元的参数的个数就为:W*H*C个权值加1个偏置。在卷积神经网络中,我们称这样一个神经元为一个 滤波器(filter) 。
(3)我们通过滑动的方式让感受野铺满整个图片,假设图片的尺寸是W1*H1*C,滑动步长为S,零填充的数量为P。假设感受野的个数是W2*H2,其中,
(4)我们让所有感受野的观测滤波器参数进行共享,即相当于一个滤波器通过滑动扫描的方式扫描了所有感受野。
(5)我们设置多个滤波器,假设滤波器的个数为K,这K个滤波器都通过滑动扫描的方式扫过整个图片。此时参数的个数为:(W*H*C+1)*K。
(6)由于每个滤波器每经过一个感受野都会进行一次计算输出一个值,所以输出的维度为:W2*H2*K。我们将这个输出称为特征图,所以特征图宽度为W2,高度为H2,通道数C2=K。
举个例子: 假设某个图片的大小是100*100*3,设置滤波器的大小为3*3*3,滤波器的个数为64,设置步长S=1,设置零填充的数量为P=0。那么卷积神经网络的参数为, 相比前向全连接 个参数,参数的个数缩小了几个数量级。
输出特征图的宽度和高度均为, 输出特征图的通道数为, 所以输出特征图的维度为98*98*64。
如果在上面输出的基础上再叠加一层卷积神经网络,滤波器的设置宽和高可以不变,但是通道数不再是3了,而是变成64了,因为输入特征图的通道数已经变64了。假设滤波器的大小为3*3*64,滤波器的个数为32,设置步长S=1,设置零填充的数量为P=0。可以计算出来,新的输出特征图的维度是96*96*32。
以上就是卷积神经网络(CNN)的解析。但是CNN一般不是单独用的,因为一般提取图片的特征是为了分类,还需要进一步处理,常见的形式如下图所示。
㈣ 初识卷积神经网络
按照上文中介绍的神经网络,如果处理一张图片的话,参数有多大呢?假设图像的大小为1200 * 1200,下一层的神经元个数为10^5,不难得出参数量为 1200 * 1200 * 10^5 = 1.44 * 10^12。可以看出一层的参数量就是很大了,如果再多加几层,那参数量大的应该是超出了内存的承受范围,这从研究和工程的角度都是不允许的。而且参数太多,很容易造成过拟合。
怎么解决这个问题呢?经过研究,从稀疏连接、参数共享和平移不变性三个方面来进行改进。
可能有些人不懂这种稀疏连接是怎么实现的?先来说说卷积操作,以一个二维矩阵为输入(可以看作是一个单通道图片的像素值),卷积产生的稀疏连接根本原因就是这块的核函数,一般的核函数的大小远小于输入的大小。
以下图例:卷积操作可以看做是一种滑窗法,首先,输入维度是4×4,输入中红色部分,先和核函数中的元素对应相乘,就是输出中左上角的元素值s1,即 s1 = a×k1+b×k2+e×k3+f×k4。
参数共享是指在一个模型的多个函数中使用相同的参数,它是卷积运算带来的固有属性。
在全连接中,计算每层的输出时,权重矩阵中的元素只作用于某一个输入元素一次;
而在卷积神经网络中,卷积核中的每一个元素将作用于每一个局部输入的特定位置上。根据参数共享的思想,我们只需要学习一组参数集合,而不需要针对每一个位置的每一个参数来进行优化学习,从而大大降低了模型的存储需求。
如果一个函数的输入做了一些改变,那么输出也跟着做出同样的改变,这就时平移不变性。
平移不变性是由参数共享的物理意义所得。在计算机视觉中,假如要识别一个图片中是否有一只猫,那么无论这只猫在图片的什么位置,我们都应该识别出来,即就是神经网络的输出对于平移不变性来说是等变的。
根据稀疏连接、参数共享和平移不变性三个思想,卷积核就应运而生了。看下图,有个直观的感受。
上图就是在一个通道上做的卷积,但现实中,图片一般是由3个通道构成(R\G\B),卷积核也由二维的平面生成了三维立体。具体的样子如下图:
如上图所示,Filter W0 即为卷积核,其大小为(3 * 3 * 3),每个3*3的二维平面会和图片的相应的通道进行卷积,3个通道的结果相加后加上统一的偏置b0,结果即为Output Volume 第一个通道的第一个位置的数。
从上图还可以看出 Input Volume 四周加了0,这个0叫做padding,一般是为了卷积划动的过程中包含原有的所有数;而多通道卷积核计算过程和卷积核计算过程,不太一样的是多通道卷积核计算过程每次滑2下,这个滑动的距离叫做步长-stride。
所以通过输入大小和卷积核大小,我们可以推断出最终的结果的大小。比如上图卷积核计算过程,输入大小为5 * 5,卷积核为3 * 3,那么卷积核在原图上每次滑动一格,横向滑3次,纵向也是3次,最终结果为 3 * 3。在多通道卷积核计算过程中,每次滑动为2格,横向滑3次,纵向也是3次,最终结果也为 3*3。可以推断出,最终大小的公式为:(输入大小 - 卷积核大小)/ 滑动步长。
在卷积核计算过程,可以看出经过卷积后的大小变小了,那能不能经过卷积计算且大小不变呢?这里,引出了 padding 的另一个作用,保证输入和输出的大小一致。比方输出的 5*5 加 padding,那么四周就被0围绕了,这时的输入大小就变为7 * 7, 再经过 3 * 3的卷积后,按照上边推断出的公式,可以得出 最终的大小为 5 * 5,这时与输入大小保持了一致。
池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。
简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。下图演示一下Max pooling。
对于每个2 * 2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2 * 2窗口中最大的数是1,那么输出矩阵的第一个元素就是1,如此类推。
全连接层的部分就是将之前的结果展平之后接到最基本的神经网络了。
根据上边的介绍,可以得出,卷积核的通道数目和输入的图像的通道数目是保持一致的,而输出的通道数目是和卷积核数目是一致的。这样参数量可以得出,假设输入的通道为5,卷积核大小为 3 * 3 ,输出的通道数目为10,那么参数量为:3 * 3 * 5 * 10,其中3 * 3 * 5是1个卷积核的参数个数,3 * 3 * 5 * 10 是 10个卷积核的参数个数,也就总共的参数个数。
在卷积中,滑动一次会经过多次的点乘,只经过一次的加法,所以加法的计算量可以忽略不计。其中,滑动一次会的点乘次数和卷积核的大小有关系,比方 3 * 3的卷积,则是经过了 3 * 3 = 9次点积。一共滑动多少次和输出大小有关系,比方 输出的结果也为 3 * 3,那么就是滑动了9次。这样就可以得出输入和输出单通道时计算量 3 * 3 * 3 * 3 = 81。那么对于输入多通道时,卷积核也需要增加相应的通道数目,此时应该在刚才的计算量上乘以通道的数目,得出输入多通道的一个卷积核的计算量。这样,对于输出多通道,总的计算量则是乘以多个卷积核即可。