卷积神经网络
-
随着输入数据规模的增大,计算机视觉的处理难度也大幅增加。 64 × 64 × 3 64 \times 64 \times 3 64×64×3 的图片特征向量维度为12288,而 1000 × 1000 × 3 1000 \times 1000 \times 3 1000×1000×3 的图片数据量达到了300万。随着数据维度的增加,神经网络的参数量也会急剧上升。如果使用标准的全连接神经网络,参数量会达到30亿。为了有效处理大规模数据,卷积神经网络(Convolution NN)成为了计算机视觉中的关键技术。与标准的全连接网络不同,CNN能够通过卷积运算减少参数数量,从而避免过拟合和计算瓶颈,并有效处理大规模图片数据。
-
卷积操作通过卷积核覆盖图像的局部区域,将对应元素相乘后,相加生成一个单一数值。重复进行这个过程,卷积核逐步在图像上滑动,最终生成一个新的矩阵(特征图),矩阵元素的每个数值代表该区域的特征强度。
-
使用特定的 3 × 3 3 \times 3 3×3 卷积核(例如 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & -1\\ 1 & 0 & -1\\ 1 & 0 & -1\end{bmatrix} 111000−1−1−1 )可以有效检测图像中的垂直边缘,使用特定的 3 × 3 3 \times 3 3×3 卷积核(例如 [ 1 1 1 0 0 0 − 1 − 1 − 1 ] \begin{bmatrix}1 & 1 & 1\\ 0 & 0 & 0\\ -1 & -1 & -1\end{bmatrix} 10−110−110−1 )可以有效检测图像中的水平边缘。 6 × 6 6 \times 6 6×6 图像经过卷积后输出的 4 × 4 4 \times 4 4×4 矩阵揭示了图像中垂直边缘的存在和位置。当图像较小时,检测到的边缘可能较粗。在更高分辨率的图像中,检测效果会更加精准。在更复杂的网络结构中,卷积层可以堆叠使用,以逐步提取更高级的特征。
-
卷积运算不仅可以检测边缘,还能够区分由亮到暗和由暗到亮的过渡,这被称为正边与负边。当图像亮度从左到右发生翻转时,卷积结果中的数值符号也会发生变化(例如从30变为-30)。如果对正负边缘不感兴趣,可以对卷积结果取绝对值,忽略过渡的方向性。
-
通过不同的 3 × 3 3 \times 3 3×3 卷积核,可以检测到更复杂的边缘模式。在小尺寸图像(如 6 × 6 6 \times 6 6×6 )中,卷积运算可能出现过渡带,但在大尺寸图像(如 1000 × 1000 1000 \times 1000 1000×1000 )中,这些过渡带会变得更清晰,边缘检测效果更加显著。每个卷积核的输出数值代表对应区域的边缘强度和方向性。
-
除了上述卷积核外,还有其他不同类型的卷积核,但这些手工设计的卷积核在特定任务上表现良好,但在复杂场景下可能存在局限性。
Sobel卷积核:使用 [ 1 0 − 1 2 0 − 2 1 0 − 1 ] \begin{bmatrix}1 & 0 & -1 \\ 2 & 0 & -2 \\ 1 & 0 & -1 \end{bmatrix} 121000−1−2−1 ,在中间一行增加权重,使边缘检测更加鲁棒。
Scharr卷积核:使用更大权重的 [ 3 0 − 3 10 0 − 10 3 0 − 3 ] \begin{bmatrix}3 & 0 & -3 \\ 10 & 0 & -10 \\ 3 & 0 & -3 \end{bmatrix} 3103000−3−10−3 ,在特定场景下检测效果更好。
-
在深度学习中, 3 × 3 3 \times 3 3×3 卷积核的9个数值可以被当作参数,通过反向传播算法进行学习和优化。在这种情况下,神经网络可以学习到不仅仅是垂直和水平的边缘特征,还可以检测到任意角度的边缘,甚至是更加复杂、无法预设的特征。这种参数学习的思想极大提升了卷积神经网络在边缘检测和特征提取方面的灵活性和泛化能力。
从此,卷积神经网络不再局限于手工设计的卷积核,而是通过大量数据和训练过程,自动学习最优的卷积核参数。
-
在卷积操作中,使用一个 f × f f \times f f×f 的卷积核对一个 n × n n \times n n×n 的图像进行卷积,输出的尺寸会变为 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1) \times (n-f+1) (n−f+1)×(n−f+1) 。但是这样会有两个问题:
缩小问题:每次卷积操作都会使图像尺寸减小,经过多层卷积后,图像可能会缩小到 1 × 1 1 \times 1 1×1 ,这对深度网络的训练和特征提取不利。
边缘信息丢失:图像的边缘像素点在卷积操作中较少被覆盖,导致边缘信息在特征提取过程中被忽略。
为了解决图像尺寸缩小和边缘信息丢失的问题,可以在图像边缘进行填充(Padding),即在图像四周填充额外的像素。
在填充了 p p p 个像素后,输出尺寸可以用公式表示为:( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n + 2p - f + 1) \times (n + 2p - f + 1) (n+2p−f+1)×(n+2p−f+1)
当 f f f 为奇数时,可以保证对称填充,使得图像四周的填充均匀,避免不对称填充导致的信息偏差。同时,奇数维卷积核有一个明确的中心像素点,这对于特征对齐和定位更加方便,也使得网络在不同位置的像素点都能均匀地参与特征提取。
-
Valid卷积:不进行填充( p = 0 p=0 p=0 ),输出尺寸为 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1) \times (n-f+1) (n−f+1)×(n−f+1) 。
Same卷积:填充足够的像素,使得输出尺寸与输入尺寸相同。对于奇数维的卷积核,填充量为 ( f − 1 ) / 2 (f−1)/2 (f−1)/2 。在构建卷积神经网络时,推荐使用Same卷积来保持图像尺寸,减少信息损失。
在实际应用中,通常使用0填充,即在边缘添加像素值为0的填充值。
-
**步幅(stride)**是控制卷积操作中卷积核移动步长的重要参数。通过调整步幅,可以决定每次卷积核滑动时跳过多少像素。当步幅为2时, 3 × 3 3 \times 3 3×3 的卷积核在 7 × 7 7 \times 7 7×7 的图像上卷积,每次移动跳过2个像素,相较于步幅为1时,卷积核的移动距离更大。
卷积操作的输出尺寸为
⌊ n + 2 p − f s + 1 ⌋ × ⌊ n + 2 p − f s + 1 ⌋ \lfloor \frac{n+2p-f}{s}+1 \rfloor \times \lfloor \frac{n+2p-f}{s}+1 \rfloor ⌊sn+2p−f+1⌋×⌊sn+2p−f+1⌋
其中, n n n 是输入图像的尺寸, p p p 是填充大小, f f f 是卷积核的尺寸, s s s 是步幅。如果公式中的商不是整数,通常需要向下取整。这意味着当卷积核不能完全覆盖图像时,只有当卷积核完全位于图像内时才进行计算。
-
彩色图像通常是由多个颜色通道(如红、绿、蓝)组成的,每个通道对应一个二维的灰度图像。以 6 × 6 × 3 6 \times 6 \times 3 6×6×3 的图像为例,3表示颜色通道数,图像的高度和宽度为 6 × 6 6 \times 6 6×6 。为了进行卷积操作,需要使用一个三维的卷积核,例如 3 × 3 × 3 3 \times 3 \times 3 3×3×3 的卷积核,它与图像的三个颜色通道相匹配。
如果只想检测图像红色通道的边缘,可以将第一个卷积核设为 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 1 & 0 & - 1 \\ 1 & 0 & - 1 \\\end{bmatrix} 111000−1−1−1 ,而绿色和蓝色通道全为0。把这三个矩阵堆叠在一起形成一个 3 × 3 × 3 3 \times 3 \times 3 3×3×3 的矩阵,可以形成一个检测红色通道垂直边界的卷积核。
如果不关心垂直边界在哪个颜色通道,可以使用三个通道都是 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 1 & 0 & - 1 \\ 1 & 0 & - 1 \\ \end{bmatrix} 111000−1−1−1 的卷积核。
-
卷积神经网络会使用多个卷积核来检测不同的特征。例如,一个卷积核可以用于检测垂直边缘,另一个用于检测水平边缘。将不同卷积核的输出堆叠在一起,得到多通道的输出结果,这样就可以同时捕捉到不同的特征。最后图像输出的通道数由使用的卷积核数量决定。
-
卷积神经网络中的卷积层,通过两个卷积核对一个三维图像进行卷积处理,得到两个不同的 4 × 4 4 \times 4 4×4 矩阵。每个卷积核提取图像的不同特征,使用每个卷积核的卷积结果,加上偏差并应用非线性激活函数(如ReLU),得到最终的 4 × 4 4 \times 4 4×4 矩阵输出。最后将两个 4 × 4 4 \times 4 4×4 矩阵堆叠,形成一个 4 × 4 × 2 4 \times 4 \times 2 4×4×2 的三维输出,这就是卷积层的输出。
前向传播过程为 z [ 1 ] = ω [ 1 ] a [ 0 ] + b [ 1 ] z^{[1]} = \omega^{[1]} a^{[0]} + b^{[1]} z[1]=ω[1]a[0]+b[1] ,其中 a [ 0 ] a^{[0]} a[0] 是输入, ω [ 1 ] \omega^{[1]} ω[1] 是卷积核, b [ 1 ] b^{[1]} b[1] 是偏差。执行卷积操作相当于执行一个线性变换(加权和),然后加上偏差,最后应用非线性激活函数。
-
卷积层的输入通常标记为 n H [ l − 1 ] × n W [ l − 1 ] × n c [ l − 1 ] n_H^{[l-1]} \times n_W^{[l-1]} \times n_c^{[l-1]} nH[l−1]×nW[l−1]×nc[l−1] ,表示上一层的激活值。输出图像的维度为 n H [ l ] × n W [ l ] × n c [ l ] n_H^{[l]} \times n_W^{[l]} \times n_c^{[l]} nH[l]×nW[l]×nc[l] ,其大小由卷积核、步幅、填充等因素决定。
卷积操作的输出高度为 n H [ l ] = ⌊ n H [ l − 1 ] + 2 p − f s + 1 ⌋ n_H^{[l]} = \lfloor\frac{n_H^{[l-1]} + 2p - f}{s} + 1\rfloor nH[l]=⌊snH[l−1]+2p−f+1⌋ (其中 n H [ l − 1 ] n_H^{[l-1]} nH[l−1] 是上一层的高度, p p p 是padding, f f f 是卷积核大小, s s s 是步幅)。输出宽度 n W [ l ] = ⌊ n W [ l − 1 ] + 2 p − f s + 1 ⌋ n_W^{[l]} = \lfloor\frac{n_W^{[l-1]} + 2p - f}{s} + 1\rfloor nW[l]=⌊snW[l−1]+2p−f+1⌋ 。
输出图像的深度(即通道数)由使用的卷积核的数量决定。例如,如果有2个卷积核,输出将是 n H [ l ] × n W [ l ] × 2 n_H^{[l]} \times n_W^{[l]} \times 2 nH[l]×nW[l]×2 ,如果有10个卷积核,输出将是 n H [ l ] × n W [ l ] × 10 n_H^{[l]} \times n_W^{[l]} \times 10 nH[l]×nW[l]×10 。每个卷积核的通道数必须与输入图像的通道数一致,对于一个 n H [ l − 1 ] × n W [ l − 1 ] × n c n_H^{[l-1]} \times n_W^{[l-1]} \times n_c nH[l−1]×nW[l−1]×nc 的图像输入,卷积核的尺寸必须为 f × f × n c [ l − 1 ] f \times f \times n_c^{[l-1]} f×f×nc[l−1] 。
通过使用多个卷积核,卷积层的总参数数量为 f [ l ] × f [ l ] × n c [ l − 1 ] × n c [ l ] f^{[l]} \times f^{[l]} \times n_c^{[l-1]} \times n_c^{[l]} f[l]×f[l]×nc[l−1]×nc[l] ,其中 n c [ l ] n_c^{[l]} nc[l] 是该层的卷积核数量。偏差是每个卷积核对应的一个实数,通常表示为一个 1 × 1 × 1 × n c [ l ] 1\times1\times1\times n_c^{[l]} 1×1×1×nc[l] 的四维张量。
无论输入图片的大小(如 1000 × 1000 1000\times1000 1000×1000 或 5000 × 5000 5000\times5000 5000×5000 ),卷积层的参数数量都是固定的。该特性有助于减少过拟合,因为参数数量不随输入图像的大小变化。
-
假定想要构建一个深度卷积神经网络,我们会输入一张维度 39 × 39 × 3 39 \times 39 \times 3 39×39×3 的图片。
最终,从图片中提取出1960维的特征向量,再输入到后面的全连接层进行进一步处理。随着网络层数的增加,图像尺寸逐渐减小,从 39 × 39 39\times 39 39×39 到 37 × 37 37\times 37 37×37,再到 17 × 17 17\times 17 17×17 ,最后到 7 × 7 7\times 7 7×7。通道数逐渐增加 ,从3到10,再到20,最后到40。
-
池化层通过降低数据的空间维度(高度和宽度)来减少模型参数的数量,从而减小模型的存储需求。池化层还降低了计算的复杂度,因为池化层减少了需要处理的数据量。池化有助于防止过拟合,因为它使得神经网络不依赖于某个特定的位置或小的变动,从而提高了对输入图像特征的鲁棒性。
-
最大池化:对于每个卷积核,最大池化从输入特征图中提取最大值。池化区域是一个 2 × 2 2 \times 2 2×2 矩阵,步幅为2,意味着每次在 2 × 2 2 \times 2 2×2 的区域内计算最大值并移动2步。
池化层的超参数为卷积核大小 f f f 和步幅 s s s,池化层的输出维度计算方式和卷积层相同。
三维池化层输出的维度将是池化操作应用于每个通道后的结果,通常会降低图像的空间分辨率,但保持通道数不变,即输出的通道数与输入相同。
平均池化:取池化区域的平均值。
最大池化通常用于大多数卷积神经网络中,它能够保留图像中的关键特征(例如边缘或角点),并且效果非常好。
平均池化虽然较少使用,但在一些深度神经网络中,尤其是图像较大的情况下,可能会用到平均池化来对输入的特征图进行下采样。
池化层是一个固定操作,所有的计算都是基于池化区域的最大值或平均值,且没有需要学习的参数。梯度下降并不涉及池化层的参数学习。在最大池化中,通常使用的超参数是 f = 2 f = 2 f=2 , s = 2 s = 2 s=2 ,这会将输入的高度和宽度缩小一半。
池化层的主要目的是降低空间分辨率,但保持深层特征的重要信息。最大池化通过选择最大值来保留重要的特征点,从而增强网络的泛化能力。
-
池化操作没有可训练的参数,但它会影响到梯度的传播。池化层会根据输入特征图的区域来决定如何进行下采样,例如:
最大池化:在某个区域内,选择最大值,并将该最大值作为输出。在反向传播时,只有当最大值位置的节点被选择时,才会传递梯度,其它位置的梯度为零。
平均池化:对某个区域内的所有值取平均,反向传播时,梯度会均匀地分配到该区域的每个位置。
因此,池化层不会像卷积层一样影响权重的更新,但池化会影响反向传播中梯度的分配。
-
想要构建一个卷积神经网络来识别手写数字。采用类似LeNet-5架构,输入是一张 32 × 32 × 3 32 \times 32 \times 3 32×32×3 的RGB图片,输出是一个softmax层,用于分类。
随着网络加深,激活值数量逐渐减少。
卷积层的参数数量相对较少,主要由卷积核的大小和数量决定。全连接层占据了大部分参数量。如FC3权重矩阵为 120 × 400 120 \times 400 120×400,FC4权重矩阵为 84 × 120 84 \times 120 84×120。
常见模式是逐层减小高度和宽度,同时增加通道数量。一般采用多个卷积层后接一个池化层,再接多个卷积层后接另一个池化层,将矩阵平整化为一维向量后,最后连全连接层和Softmax层的模式。网络设计要注意激活值的变化,避免激活值尺寸下降过快,导致信息丢失。
-
卷积层在神经网络中有两个主要优势:参数共享和稀疏连接。
参数共享是指卷积网络利用同一个卷积核(特征检测器)在输入图片的不同区域共享参数。例如,一个检测垂直边缘的卷积核可以用于检测图片左上角、右下角或其他任意区域的垂直边缘。参数共享可以大幅减少需要训练的参数数量,并且共享的参数适用于整张图片的所有区域,使得特征检测器能够更高效地提取有用特征。这些参数对于图像中高阶特征(如眼睛、猫脸)同样适用,增强网络的通用性。
稀疏连接是指卷积操作中,每个输出单元只连接到输入中的一个局部区域,而非与整个输入相连。稀疏连接降低了参数数量,因为仅需计算局部区域的值。每个输出单元的计算仅依赖于相关的输入区域,与不相关的输入无关,避免了全连接的冗余,防止过拟合。
-
卷积神经网络之所以高效,第一个原因是参数数量显著减少,使得模型训练更快,对小数据集更有效,避免过拟合。卷积核为5×5,数量为6,则每个卷积核26个参数(包括偏差)。
第二个原因是卷积网络能够对图片中物体的位置变化具有鲁棒性,即使图片中某物体平移了一定距离,卷积网络仍能正确识别,即能捕捉平移不变性。因为卷积层共享的卷积核和稀疏连接特性,使得网络对输入图片的特征提取具有更强的适应性。