Main Content

指定卷积神经网络的层

创建和训练新卷积神经网络 (ConvNet) 的第一步是定义网络架构。本主题说明 ConvNet 层的细节,以及这些层在 ConvNet 中出现的顺序。有关深度学习层的完整列表以及如何创建它们,请参阅深度学习层列表。要了解序列分类和回归的 LSTM 网络,请参阅长短期记忆神经网络。要了解如何创建自己的自定义层,请参阅定义自定义深度学习层

根据所包含的层的类型和数量,网络架构可能有所不同。包含的层的类型和数量取决于特定的应用或数据。例如,分类网络通常有 softmax 层和分类层,而回归网络必须在网络末尾有回归层。只包含一个或两个卷积层的较小网络可能基于少量灰度图像数据进行学习就足够了。另一方面,对于具有数百万彩色图像的更复杂数据,您可能需要包含多个卷积层和全连接层的更复杂的网络。

要指定所有层按顺序连接的深度网络的架构,请直接创建一个层数组。例如,要创建一个将 28×28 灰度图像分为 10 个类的深度网络,请指定层数组。

layers = [
    imageInputLayer([28 28 1])  
    convolution2dLayer(3,16,'Padding',1)
    batchNormalizationLayer
    reluLayer    
    maxPooling2dLayer(2,'Stride',2) 
    convolution2dLayer(3,32,'Padding',1)
    batchNormalizationLayer
    reluLayer 
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];
layersLayer 对象组成的数组。然后,您可以使用 layers 作为训练函数 trainNetwork 的输入。

要指定所有层按顺序连接的神经网络的架构,请直接创建一个层数组。要指定层可以有多个输入或输出的网络架构,请使用 LayerGraph 对象。

图像输入层

使用 imageInputLayer 创建一个图像输入层。

图像输入层将图像输入到网络并应用数据归一化。

使用 inputSize 参数指定图像大小。图像的大小对应于该图像的高度、宽度和颜色通道的数量。例如,对于灰度图像,通道数为 1,而对于彩色图像,通道数为 3。

卷积层

二维卷积层将滑动卷积滤波器应用于二维输入。使用 convolution2dLayer 创建一个二维卷积层。

卷积层包含各种组成部分。1

滤波器和步幅

卷积层由连接到输入图像的子区域或连接到前一层的输出的神经元组成。该层在扫描图像的同时学习由这些区域所局部化的特征。使用 convolution2dLayer 函数创建层时,您可以使用 filterSize 输入参数指定这些区域的大小。

对于每个区域,trainnettrainNetwork 函数计算权重和输入的点积,然后加上偏置项。应用于图像中某个区域的一组权重称为滤波器。滤波器沿输入图像垂直和水平移动,对每个区域重复相同的计算。换句话说,滤波器对输入进行卷积。

下图显示一个扫描输入的 3×3 滤波器。下部子图表示输入,上部子图表示输出。

Animation showing a sliding 3-by-3 filter. At each step, the filter spans a patch of an input image (the lower map) and has output corresponding to single pixel of the output image (the upper map). The input is a 4-by-4 image. The ouptut is a 2-by-2 image.

滤波器移动的步长称为步幅。您可以使用 Stride 名称-值对组参数指定步长。神经元连接的局部区域可能会重叠,具体取决于 filterSize'Stride' 值。

下图显示一个扫描输入的 3×3 滤波器,步幅为 2。下部子图表示输入,上部子图表示输出。

Animation showing a sliding 3-by-3 filter with stride 2. At each step, the filter moves two pixels. The input is a 5-by-5 image. The ouptut is a 2-by-2 image.

滤波器中的权重数为 h*w*c,其中 h 是高度,w 是滤波器的宽度,c 是输入中的通道数。例如,如果输入是彩色图像,则颜色通道的数量是 3。滤波器的数量决定卷积层输出中的通道数量。使用 numFilters 参数和 convolution2dLayer 函数指定滤波器的数量。

扩张卷积

在扩张卷积中,通过在滤波器元素之间插入空白来扩展滤波器。使用 'DilationFactor' 属性指定扩张系数。

使用扩张卷积可增加层的感受野(层可以看到的输入区域),而不增加参数个数或计算量。

层通过在每个滤波器元素之间插入零来扩展滤波器。扩张系数决定对输入进行采样的步长,或等效地决定滤波器的上采样因子。它对应的有效滤波器大小为:(Filter Size – 1) .* Dilation Factor + 1。例如,扩张系数为 [2 2] 的 3×3 滤波器等效于在元素间插入零的 5×5 滤波器。

下图显示一个使用扩张系数 2 扫描输入来扩张的 3×3 滤波器。下部子图表示输入,上部子图表示输出。

Animation showing a sliding dilated 3-by-3 filter. The filter spans a 5-by-5 region because it has a one pixel gap between each pixel. The input is a 7-by-7 image. The output is a 3-by-3 image.

特征图

当滤波器扫描输入时,它对卷积使用相同的权重和偏置,从而形成特征图。每个特征图均为使用不同权重集和不同偏置的卷积结果。因此,特征图的数量等于滤波器的数量。卷积层中的参数总数为 ((h*w*c + 1)*Number of Filters),其中 1 为偏置。

填充

您还可以使用 'Padding' 名称-值对组参数在垂直和水平方向上对输入图像边界应用填充。填充是指将向输入图像的边界追加值以增大其大小。通过调整零填充,您可以控制层的输出大小。

下图显示一个用于扫描输入的 3×3 滤波器,其零填充大小为 1。下部子图表示输入,上部子图表示输出。

Animation showing a sliding 3-by-3 filter over a padded image. The input image is padded such that it is one pixel larger in each direction. When the filter slides over the input image, it can cover the padding regions. The input is a 5-by-5 image. The padded input is a 7-by-7 image. The output is a 5-by-5 image.

输出大小

卷积层的输出高度和宽度为 (Input Size – ((Filter Size – 1)*Dilation Factor + 1) + 2*Padding)/Stride + 1。此值必须为整数,才能完全覆盖整个图像。如果这些选项的组合无法完全覆盖图像,则默认情况下,软件会忽略卷积中沿图像右边缘和下边缘的其余部分。

神经元数量

输出高度和宽度的乘积是特征图中神经元的总数,即 Map Size。卷积层中的神经元总数(输出大小)是 Map Size*Number of Filters。

例如,假设输入图像是一个 32×32×3 彩色图像。对于具有 8 个滤波器且滤波器大小为 5×5 的卷积层,每个滤波器的权重数是 5 * 5 * 3 = 75,并且该层中的参数总数是 (75 + 1) * 8 = 608。如果每个方向的步幅为 2,并且指定的填充大小为 2,则每个特征图为 16×16。这是因为 (32 - 5 + 2 * 2)/2 + 1 = 16.5,图像右侧和底部一些最外层的填充被丢弃。最后,该层中神经元的总数是 16 * 16 * 8 = 2048。

通常,来自这些神经元的结果以某种非线性(例如修正线性单元 (ReLU))形式进行传递。

学习参数

在定义卷积层时,您可以使用名称-值对组参数来调整层的学习率和正则化选项。如果您选择不指定这些选项,则 trainnettrainNetwork 函数使用通过 trainingOptions 函数定义的全局训练选项。有关全局和层训练选项的详细信息,请参阅设置参数并训练卷积神经网络

层数

一个卷积神经网络可以包含一个或多个卷积层。卷积层的数量取决于数据的量和复/实性。

批量归一化层

使用 batchNormalizationLayer 创建一个批量归一化层。

批量归一化层独立地对每个通道的所有观测值的小批量数据进行归一化。为了加快卷积神经网络的训练并降低对网络初始化的敏感度,请在卷积层和非线性部分之间使用批量归一化层,如 ReLU 层。

该层首先通过减去小批量均值并除以小批量标准差来归一化每个通道的激活。然后,该层按可学习偏移量 β 对输入进行偏移,并按可学习缩放因子 γ 对其进行缩放。β 和 γ 本身就是在网络训练期间会更新的可学习参数。

批量归一化层对神经网络中的激活值和梯度传播进行归一化,使网络训练成为更简单的优化问题。为了充分利用这一点,您可以尝试提高学习率。由于优化问题更容易,参数更新可以更大,网络学习的速度更快。您也可以尝试减少 L2 和丢弃正则化。对于批量归一化层,特定图像在训练期间的激活取决于哪些图像碰巧出现在同一小批量中。为了充分利用这种正则化效果,请尝试在每轮训练之前对训练数据进行乱序处理。要指定训练期间数据乱序的频率,请使用 trainingOptions'Shuffle' 名称-值对组参数。

ReLU 层

使用 reluLayer 创建一个 ReLU 层。

ReLU 层对输入的每个元素执行阈值运算,其中任何小于零的值都设置为零。

卷积层和批量归一化层通常后跟非线性激活函数,例如由 ReLU 层指定的修正线性单元 (ReLU)。ReLU 层对每个元素执行阈值运算,其中任何小于零的输入值都设置为零,即

f(x)={x,x00,x<0.

ReLU 层不更改其输入的大小。

还有其他执行不同运算的非线性激活层,这些层可以提高某些应用的网络准确度。有关激活层的列表,请参阅激活层

跨通道归一化(局部响应归一化)层

使用 crossChannelNormalizationLayer 创建一个跨通道归一化层。

按通道局部响应(跨通道)归一化层执行按通道归一化。

此层执行按通道局部响应归一化。它通常在 ReLU 激活层之后。此层将每个元素替换为它使用来自一定数量的相邻通道的元素(归一化窗口中的元素)获得的归一化值。也就是说,对于输入中的每个元素 xtrainnettrainNetwork 函数使用

x'=x(K+α*sswindowChannelSize)β,

计算归一化值 x'其中 K、α 和 β 是归一化中的超参数,ss 是归一化窗口中元素的平方和 [2]。您必须使用 crossChannelNormalizationLayer 函数的 windowChannelSize 参数来指定归一化窗口的大小。您还可以使用 AlphaBetaK 名称-值对组参数来指定超参数。

前面的归一化公式与 [2] 中给出的公式略有不同。您可以通过将 alpha 值乘以 windowChannelSize 获得等效公式。

最大池化层和平均池化层

二维最大池化层通过将输入划分为矩形池化区域并计算每个区域的最大值来执行下采样。使用 maxPooling2dLayer 创建一个最大池化层。

二维平均池化层通过将输入划分为矩形池化区域,然后计算每个区域的平均值来执行下采样。使用 averagePooling2dLayer 创建一个平均池化层。

池化层在卷积层之后,用于下采样,因此可减少与后续层的连接数量。池化层自身不执行任何学习,但可减少要在后续层中学习的参数的数量。它们也有助于减少过拟合。

最大池化层返回其输入的矩形区域的最大值。矩形区域的大小由 maxPoolingLayerpoolSize 参数决定。例如,如果 poolSize[2 3],则层返回高度为 2、宽度为 3 的区域中的最大值。

平均池化层输出其输入的矩形区域的平均值。矩形区域的大小由 averagePoolingLayerpoolSize 参数决定。例如,如果 poolSize[2 3],则层返回高度为 2、宽度为 3 的区域的平均值。

池化层按照一定的步长在水平和垂直方向扫描输入,您可以使用 'Stride' 名称-值对组参数指定步长。如果池大小小于或等于步幅,则池化区域不会重叠。

对于非重叠区域(Pool Size 和 Stride 相等),如果池化层的输入是 n×n,池化区域大小是 h×h,则池化层按 h 对区域进行下采样 [6]。也就是说,卷积层的一个通道的最大或平均池化层的输出是 n/h×n/h。对于重叠区域,池化层的输出是 (Input Size – Pool Size + 2*Padding)/Stride + 1。

丢弃层

使用 dropoutLayer 创建一个丢弃层。

丢弃层以给定的概率将输入元素随机设置为零。

在训练时,层随机将输入元素设置为由丢弃掩膜 rand(size(X))<Probability 给出的零,其中 X 是层输入,然后按 1/(1-Probability) 缩放其余元素。该运算实际上更改了迭代之间的底层网络架构,有助于防止网络过拟合 [7][2]。数字越大,训练过程中丢弃的元素越多。在预测时,层的输出等于其输入。

与最大池化层或平均池化层相似,此层不进行学习。

全连接层

使用 fullyConnectedLayer 创建一个全连接层。

全连接层将输入乘以权重矩阵,然后添加偏置向量。

顾名思义,全连接层中的所有神经元都连接到前一个层中的所有神经元。该层将先前各层在图像中学习的所有特征(局部信息)组合在一起,以识别较大的模式。对于分类问题,最后一个全连接层将特征组合在一起来对图像进行分类。因此,网络的最后一个全连接层的 outputSize 参数等于数据集的类的数目。对于回归问题,输出大小必须等于响应变量的数目。

在创建全连接层时,您还可以使用相关的名称-值对组参数来调整该层的学习率和正则化参数。如果您选择不调整它们,则软件将使用 trainingOptions 函数定义的全局训练参数。有关全局和层训练选项的详细信息,请参阅设置参数并训练卷积神经网络

如果层的输入是序列(例如,在 LSTM 网络中),则全连接层独立作用于每个时间步。例如,如果全连接层之前的层输出大小为 D×N×S 的数组 X,则全连接层输出大小为 outputSize×N×S 的数组 Z。在时间步 t 中,Z 的对应项是 WXt+b,其中 Xt 表示 X 的时间步 t。

输出层

softmax 层和分类层

softmax 层对输入应用 softmax 函数。使用 softmaxLayer 创建一个 softmax 层。

分类层计算具有互斥类的分类和加权分类任务的交叉熵损失。使用 classificationLayer 创建一个分类层。

对于分类问题,通常在最终全连接层后跟 softmax 层,然后跟分类层。

输出单元激活函数是 softmax 函数:

yr(x)=exp(ar(x))j=1kexp(aj(x)),

其中 0yr1 并且 j=1kyj=1

对于多类分类问题,softmax 函数是最后一个全连接层后的输出单元激活函数:

P(cr|x,θ)=P(x,θ|cr)P(cr)j=1kP(x,θ|cj)P(cj)=exp(ar(x,θ))j=1kexp(aj(x,θ)),

其中 0P(cr|x,θ)1j=1kP(cj|x,θ)=1。此外,ar=ln(P(x,θ|cr)P(cr)),其中 P(x,θ|cr) 是给定类 r 的样本的条件概率,P(cr) 是类先验概率。

softmax 函数也称为归一化指数,可视为逻辑 sigmoid 函数的多类泛化 [8]

对于典型的分类网络,分类层通常在 softmax 层之后。在分类层中,trainNetwork 接受来自 softmax 函数的值,使用交叉熵函数将每个输入赋给 K 个互斥类之一以实现 1-of-K 编码方案 [8]

loss=1Nn=1Ni=1Kwitnilnyni,

其中 N 是样本数,K 是类数,wi 是类 i 的权重,tni 指示第 n 个样本属于第 i 个类,yni 是类 i 的样本 n 的输出,在本例中它是来自 softmax 函数的值。换句话说,yni 是网络将第 n 个输入与类 i 相关联的概率。

回归层

使用 regressionLayer 创建一个回归层。

回归层计算回归任务的半均方误差损失。对于典型的回归问题,回归层必须位于最终全连接层之后。

对于单个观测值,均方误差由下式给出:

MSE=i=1R(tiyi)2R,

其中,R 是响应的数目,ti 是目标输出,yi 是网络对响应 i 的预测。

对于图像和“序列到单个”回归网络,回归层的损失函数是预测响应的半均方误差,未由 R 进行归一化:

loss=12i=1R(tiyi)2.

对于图像到图像回归网络,回归层的损失函数是每个像素的预测响应的半均方误差,未由 R 进行归一化:

loss=12p=1HWC(tpyp)2,

其中 H、W 和 C 分别表示输出的高度、宽度和通道数,p 对 t 和 y 的每个元素(像素)进行线性索引。

对于“序列到序列”回归网络,回归层的损失函数是每个时间步的预测响应的半均方误差,未由 R 进行归一化:

loss=12Si=1Sj=1R(tijyij)2,

其中 S 是序列长度。

在训练时,软件计算小批量中各观测值的均值损失。

参考

[1] Murphy, K. P. Machine Learning: A Probabilistic Perspective. Cambridge, Massachusetts: The MIT Press, 2012.

[2] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Communications of the ACM 60, no. 6 (May 24, 2017): 84–90. https://doi.org/10.1145/3065386

[3] LeCun, Y., Boser, B., Denker, J.S., Henderson, D., Howard, R.E., Hubbard, W., Jackel, L.D., et al. ''Handwritten Digit Recognition with a Back-propagation Network.'' In Advances of Neural Information Processing Systems, 1990.

[4] LeCun, Y., L. Bottou, Y. Bengio, and P. Haffner. ''Gradient-based Learning Applied to Document Recognition.'' Proceedings of the IEEE. Vol 86, pp. 2278–2324, 1998.

[5] Nair, V. and G. E. Hinton. "Rectified linear units improve restricted boltzmann machines." In Proc. 27th International Conference on Machine Learning, 2010.

[6] Nagi, J., F. Ducatelle, G. A. Di Caro, D. Ciresan, U. Meier, A. Giusti, F. Nagi, J. Schmidhuber, L. M. Gambardella. ''Max-Pooling Convolutional Neural Networks for Vision-based Hand Gesture Recognition''. IEEE International Conference on Signal and Image Processing Applications (ICSIPA2011), 2011.

[7] Srivastava, Nitish, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever, and Ruslan Salakhutdinov. "Dropout: A Simple Way to Prevent Neural Networks from Overfitting." The Journal of Machine Learning Research 15, no. 1 (January 1, 2014): 1929–58

[8] Bishop, C. M. Pattern Recognition and Machine Learning. Springer, New York, NY, 2006.

[9] Ioffe, Sergey, and Christian Szegedy. “Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift.” Preprint, submitted March 2, 2015. https://arxiv.org/abs/1502.03167.

另请参阅

| | | | | | | | | | | | | | |

相关主题


1 Image credit: Convolution arithmetic (License)