基于CS231N的学习整理:http://cs231n.github.io/convolutional-networks/
卷积神经网络(CNN)与神经网络相比的优势:
1. 输入的是 图片
2. 减少网络中的参数数量(参数过多导致过拟合)
一。架构概述 Architecture Overview
ConvNet将其神经元按照三个维度排列(width、height、depth),每一层都将三维输入转换为激活神经元三维输出。
二。卷积神经网络层 ConvNet Layers
构建卷积神经网络架构有如下三种主要层次:卷积层、池化层、全连接层
卷积过程以及各个层特点:
a.输入层 Input Layer:保存原始像素值
b.卷积层 ConV Layer: 每个神经元都计算权重与连接到他们输入值体积的点积并输出。有参数和超参数。
c.线性整流层 ReLu Layer: 不改变体积 f(x)=max(0,x)。无参数,无超参数。
d.池化层 Pool Layer: 沿着空间维度(width、height)进行下采样。无参数,有超参数。
e.全连接层 FC Layer: 计算分类得分。有参数和超参数。
1. 卷积层Convolution Layer
局部连接(Local Connecting)ConV层将神经元与输入图片的局部区域相连接,每个神经元在空间上非常小但是会延申到整个输入的深度,即输入体积在整个深度上是完整的。沿深度有多个神经元,对于深度不同的同一位置与输入图片连接的区域是相同。当我们在空间维度上滑动过滤器时,我们将生成一张二维的激活图,这张图会给出该过滤器空间上每个位置的响应,当过滤器看到某种类型的视觉特征时会被激活,卷积层网络学习这些被激活的特征。在每一个CONV层上设置一整套过滤器每个过滤器都会产生一张单独的二维图,将所有的二维图像延深度方向堆叠产生输出。
空间排列(Spatial Arrangement)三种超参数控制输出尺寸的大下:深度、步幅、零填充,即空间排列上的超参数相互约束。
深度(depth):对应于我们要使用的过滤器数量,每次学习都要寻找不同的输入内容。例如:如果第一个卷积层被视作输入的原始照片,不同深度的神经元可能会被各种定向边缘或颜色斑点激活,将这一组神经元都被视作深度列。
步幅(stride):步幅为每一次过滤器移动的像素值,设置步幅会在空间中产生较小的输出。
零填充(zero-padding):如果没有零填充,那么宽度会在每一层缩减,缩减的幅度是比卷积核小一个像素值那么多。即在边界处进行零填充的目的是让输出图像与原始图像大小相同。当stride=1时,零填充通常设置为 P = (F-1)/ 2
<计算输出体积大小>
W 表示输入体积,P表示零填充个数,F表示ConV感受野的大小(即过滤器的空间范围),S表示步幅,
输出尺寸 = ( W - F + 2P) / S +1
参数共享(Parameter Sharing)目的是在卷积神经网络中控制参数的数量。如果在某个位置(X1,Y1)出现了重要的特征,那么在另一个位置(X2,Y2)也被视作重要的特征。基于以上假设,我们可以将一个单独的二维的深度切片视作一个深度切片,在每一个深度切片上使用相同的权重和偏置来约束神经元。当检测到水平边缘在图像的某个位置很重要,由于图像的平移不变性,它在其他位置也同样重要,在此情况下参数共享假设是合理的;如果ConvNet中输入的图像具有某些特定的中心结构时,我们期望在图像的一侧学习与另一侧完全不同的参数特征(例如人脸检测),此时应放宽参数共享方案,简单地将该层称之为局部连接层。
通过参数共享,每一个过滤器将产生( F*F*D1 )个权重,过滤器数量为K ,则总共会产生 (F*F*D1 )* K 个权重,以及K个偏置。
<注>由于所有神经元在深度切片上共享参数(使用相同的权重向量),那么可以将CONV层前向传递的过程计算为神经元权重与输入的卷积,因此称之为卷积层,将权重集称之为过滤器或核。
卷积运算的实现可以视作矩阵乘法:
四个hyperparater : 过滤器数量为K、覆盖的空间范围F、步幅S、零填充的个数P
1. 输入图片的局部区域被扩展成列,称之为im2col。输入图片与过滤器 F*F*D1 卷积,一次可以获得F*F*D1 大小的像素块,延伸成一列为( F*F*D1 )个.
在步长为4的过滤器滑动过程中,输出矩阵X大小:
W2 = ( W1 - F + 2P) / S +1,
H2 =( W1 - F + 2P) / S +1,
D2 = K
输出矩阵大小一共为(W2*H2*D2),
将输出矩阵的局部区域延伸成列 X_col大小为 (( F*F*D1 ) *(W2*H2*D2)),其中每一列都是扩展的感受野。
2. 卷积层的权重也可以延伸成行,如果有K个( F*F*D1 ) 大小的过滤器,W_row的大小为( K * ( F*F*D1 ) )
3. 卷积的结果等于执行矩阵相乘 np.dot(W_row, X_col)
4. 最后的输出结果必须调整为 (W2*H2*K)
缺点:该操作占用太多的空间 优点:矩阵乘法非常有效,在池化操作中还会被用到。
2。池化层(Pooling Layer)
在ConvNet体系中通常在两个卷积层之后添加池化层,其目的是逐渐减少表示空间的大小,以减少网络中的参数和计算量,防止过拟合。池化层在输入的每个深度切片上独立运行(即不改变深度尺寸)并使用max操作在空间上调整大小。最常见的池化层是使用2*2大小的过滤器,步幅为2,沿着输入的每个深度切片对宽度和高度方向进行二倍下采样,丢失75%的激活。在这种情况下,每个Max运算都将在深度切片2*2区域内取4个最大值,而深度方向上的大小保持不变。在反向传播过程中,max(x,y)将梯度路由到在前向传播过程中具有最高值的输入(不懂??),因此,池化层的前向传播记录最大激活的索引(switch)以使其在反向传播期间更有效。
<池化层运算>
输入体积 (W1*H1*D1)
两个高参数:F过滤器的空间范围,S步幅,池化层通常不使用零填充
W2 = ( W1 - F ) / S +1,
H2 =( W1 - F ) / S +1,
D2 = D1
<为何stride = 1效果更好?>
小步幅在实践中效果很好,并且可以将所有空间下采样保留给池化层,而CONV层仅在深度方向转化输入体积
3。归一化层 Normalization Layer
在实际中被证实贡献较小。
4。全连接层 Fully-connected Layer
本层神经元与上一层神经元完全连接。
5。连接FC层至CONV层
FC层与CONV层的区别:CONV层仅连接到输入体积的局部区域,并且神经元之间共享参数,但是,本层与前一层的神经元仍然会计算点积。
以下两点可以证明CONV层与FC层能够进行转换:
1. 对于任何CONV层都有一个FC层实现相同的前向功能。CONV层 局部连接 和 共享参数 机制,权重矩阵中某些块权重相等,剩下几乎为零。
2. 任何一个CONV层都可以转换成FC层。CONV层将过滤器大小设置为输入体积的大小,输出的结果与FC层输出结果相同。
将FC层转换到 CONV层的优点:每次转换都需要计算权重矩阵W,使我们能够再一次转换过程中非常有效地在大图像的许多空间位置滑动原始ConvNet,获得的输出结果是二维数组而不仅仅是单个分量的数组。
解决在原始图像上应用原始ConvNet(带有FC)步幅小于32 的办法?通过多次前进来实现。例如,可以使用stride=16向前传播两次转换后的ConvNet最后合并输出体积,第一次作用于原始图片,第二次沿着宽度和高度偏移16位。
三。卷积神经网络架构 ConvNet Architecture
1. 层模式 (Layer Pattern)
最常见的形式是堆叠CONV层-RELU层,随后POOL层,重复此结构直到图像在空间上合并为较小尺寸。
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
例如:INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC。在每个池化层之前都有两个CONV层叠加,多个CONV层叠加可以生成输入图像更复杂的特征,适用于更大更深的网络。
使用多个小的CONV层而不是使用一个大的CONV的优势:多个小的CONV层输出与一个大的CONV输出具有相同尺寸,但是在大CONV层上神经元在输入上计算线性函数,而多个小的CONV层叠加是非线性的,能够使输入具有更强的表现型,并且参数较少。
2.图层大小调整模式 (Layer Sizing Patterns)
input layer 必须能够被2整除。例如:32、6496、224、384、512
conv layer 使用很小的过滤器(3*3 ,最大5*5),步幅S=1,并且使用零填充。当F = 3,P = 1时 或 F=5 , P=2 ,CONV层不会改变输入图像的空间维度。
pool layer 下采样。F>3并不常见,会损失细节。常见的是使用2*2的感受野最大池化F=2,stride=2.或 3*3的感受野,stride=3
来源:CSDN
作者:RRWJ__
链接:https://blog.csdn.net/RRWJ__/article/details/103747752