主要内容

resnetLayers

创建二维剩余网络

    描述

    例子

    lgraph= resnetLayers (inputSizenumClasses创建一个二维残差网络,其图像输入大小为inputSize和指定的许多类numClasses.剩余网络由一堆块组成。每个块包含深度学习层。该网络包括图像分类层,适用于预测输入图像的分类标签。

    要创建三维剩余网络,请使用resnet3dLayers

    例子

    lgraph= resnetLayers (___名称=值使用前面语法中的任何输入参数,使用一个或多个名称-值参数创建剩余网络。例如,InitialNumFilters = 32在初始卷积层中指定32个过滤器。

    例子

    全部折叠

    使用瓶颈架构创建剩余网络。

    imageSize = [224 224 3];numClasses = 10;lgraph = resnetLayers(imageSize,numClasses)
    lgraph = LayerGraph with properties: Layers: [177x1 nnet.cnn.layer.Layer] Connections: [192x2 table] InputNames: {'input'} OutputNames: {'output'}

    分析网络。

    analyzeNetwork (lgraph)

    该网络相当于ResNet-50残差网络。

    使用自定义堆栈深度创建ResNet-101网络。

    imageSize = [224 224 3];numClasses = 10;stackDepth = [3 4 23 3];numFilters = [64 128 256 512];lgraph = resnetLayers(imageSize,numClasses,...StackDepth = StackDepth,...NumFilters = NumFilters)
    lgraph = LayerGraph with properties: Layers: [347x1 nnet.cnn.layer.Layer] Connections: [379x2 table] InputNames: {'input'} OutputNames: {'output'}

    分析网络。

    analyzeNetwork (lgraph)

    创建和训练残差网络来分类图像。

    方法将数字数据加载为内存中的数值数组digitTrain4DArrayData而且digitTest4DArrayData功能。

    [XTrain,YTrain] = digitTrain4DArrayData;[XTest,YTest] = digitTest4DArrayData;

    定义剩余网络。数字数据包含28 × 28像素的图像,因此,用较小的滤波器构建残差网络。

    imageSize = [28 28 1];numClasses = 10;lgraph = resnetLayers(imageSize,numClasses,...InitialStride = 1,...InitialFilterSize = 3,...InitialNumFilters = 16,...StackDepth=[4 3 2],...NumFilters=[16 32 64]);

    将选项设置为随动量随机梯度下降的默认设置。将最大epoch数设置为5,并以初始学习率0.1开始训练。

    选项= trainingOptions(“个”...MaxEpochs = 5,...InitialLearnRate = 0.1,...Verbose = false,...情节=“训练进步”);

    培训网络。

    net = trainNetwork(XTrain,YTrain,lgraph,options);

    通过评估测试数据的预测精度来测试网络的性能。使用分类函数来预测每个测试图像的类标签。

    YPred = category (net,XTest);

    计算精度。准确率是网络正确预测的标签的比例。

    精度= sum(YPred == YTest)/numel(YTest)
    准确度= 0.9956

    要使用自定义训练循环训练残差网络,首先将其转换为dlnetwork对象。

    创建残留网络。

    lgraph = resnetLayers([224 224 3],5);

    删除分类层。

    lgraph = removeLayers(“输出”);

    用一个新的输入层替换输入层归一化设置为“没有”.要使用以0为中心或z-score归一化的输入层,必须指定一个imageInputLayer属性的非空值的意思是财产。例如,意味着=总和(XTrain, 4),在那里XTrain是一个包含输入数据的4-D数组。

    newInputLayer = imageInputLayer([224 224 3],归一化=“没有”);lgraph =替换层(lgraph,“输入”, newInputLayer);

    转换为dlnetwork

    Dlnet = dlnetwork(lgraph)
    dlnet = dlnetwork with properties: Layers: [176x1 nnet.cnn.layer.Layer] Connections: [191x2 table] Learnables: [214x3 table] State: [106x3 table] InputNames: {'imageinput'} OutputNames: {'softmax'} Initialized: 1查看summary with summary。

    输入参数

    全部折叠

    网络输入图像大小,指定为以下之一:

    • 形式为[的2元向量高度宽度].

    • 形式为[的3元向量高度宽度深度),深度是通道数。集深度3.用于RGB图像和到1对于灰度图像。对于多光谱和高光谱图像,设置深度到通道数。

    高度而且宽度值必须大于或等于initialStride * poolingStride * 2D,在那里D是下采样块的数量。属性设置初始步幅InitialStride论点。池化步幅是1InitialPoolingLayer设置为“没有”,2否则。

    数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

    图像分类网络中的类数,指定为大于1的整数。

    数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

    名称-值参数

    指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

    例子:InitialFilterSize = [5,5], InitialNumFilters = 32, BottleneckType =“没有”指定5 × 5像素的初始过滤器大小、32个初始过滤器以及没有瓶颈组件的网络架构。

    初始层

    全部折叠

    第一个卷积层中的过滤器大小,指定为以下之一:

    • 正整数。过滤器具有相等的高度和宽度。例如,指定5产生一个高5和宽5的过滤器。

    • 形式为[的2元向量高度宽度].例如,指定的初始过滤器大小为(1 - 5)生成一个高为1,宽为5的过滤器。

    例子:InitialFilterSize = (5, 5)

    数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

    第一卷积层中的过滤器数量,指定为正整数。初始滤波器的数量决定了剩余网络中第一个卷积层输出中的通道(特征映射)的数量。

    例子:InitialNumFilters = 32

    数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

    在第一卷积层中的Stride,指定为a:

    • 正整数。步幅高度和宽度相等。例如,指定3.产生高3和宽3的步幅。

    • 形式为[的2元向量高度宽度].例如,指定的初始步幅(1 2)产生高为1,宽为2的步幅。

    stride定义垂直和水平遍历输入的步长。

    例子:InitialStride =(3、3)

    数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

    初始剩余块之前的第一个池化层,指定为以下之一:

    • “马克斯”-在初始剩余块之前使用最大池化层。有关更多信息,请参见maxPooling2dLayer

    • “平均”-在初始剩余块之前使用平均池化层。有关更多信息,请参见averagePooling2dLayer

    • “没有”—不要在初始剩余块之前使用池化层。

    例子:InitialPoolingLayer =“平均”

    数据类型:字符|字符串

    网络体系结构

    全部折叠

    剩余块类型,指定为以下之一:

    • “batchnorm-before-add”-在剩余块添加层之前添加批量归一化层[1]

    • “batchnorm-after-add”-在剩余块中添加层之后添加批量归一化层[2]

    ResidualBlockType参数指定批归一化层在标准和下采样残留块中的位置。有关更多信息,请参见更多关于

    例子:ResidualBlockType = " batchnorm-after-add "

    数据类型:字符|字符串

    块瓶颈类型,指定为以下之一:

    • “downsample-first-conv”-使用瓶颈残差块,在残差块的第一卷积层中执行降采样,使用2的步幅。瓶颈残差块由三个卷积层组成:1 × 1层向下采样信道维度,3 × 3卷积层,1 × 1层向上采样信道维度。

      最后一个卷积层的过滤器数量是前两个卷积层的4倍。有关更多信息,请参见NumFilters

    • “没有”—不要使用瓶颈残留块。剩余块由两个3 × 3的卷积层组成。

    瓶颈块在进行3 × 3卷积之前执行1 × 1卷积,从而将通道数量减少到1 / 4。有瓶颈块和没有瓶颈块的网络具有相似的计算复杂度,但是当使用瓶颈单元时,在剩余连接中传播的特征总数要大四倍。因此,使用瓶颈可以提高网络的效率[1].有关每个剩余块中的层的更多信息,请参见更多关于

    例子:BottleneckType = "没有"

    数据类型:字符|字符串

    每个堆栈中的剩余块数,指定为正整数向量。例如,如果堆栈深度为[3 4 6 3],网络有4个堆栈,分别有3个块、4个块、6个块和3个块。

    属性指定每个堆栈的卷积层中的过滤器数量NumFilters论点。的StackDepth值的元素个数必须与NumFilters价值。

    例子:StackDepth=[9 12 69 9]

    数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

    每个堆栈的卷积层中的过滤器数量,指定为正整数向量。

    • 当你设置BottleneckType“downsample-first-conv”,每个堆栈的每个块中的前两个卷积层具有相同数量的过滤器,由NumFilters价值。最后一个卷积层的过滤器数量是前两个卷积层的4倍。

      例如,假设你设NumFilters5 [4]而且BottleneckType“downsample-first-conv”.在第一个堆栈中,每个块中的前两个卷积层有4个过滤器,每个块中的最后一个卷积层有16个过滤器。在第二个堆栈中,每个块中的前两个卷积层有5个过滤器,最后一个卷积层有20个过滤器。

    • 当你设置BottleneckType“没有”时,每个堆栈中的卷积层具有相同数量的过滤器,由NumFilters价值。

    NumFilters值的元素个数必须与StackDepth价值。

    NumFilters值确定在初始剩余块上的剩余连接层数。满足以下条件之一,剩余连接上存在卷积层:

    • BottleneckType = " downsample-first-conv "(默认),InitialNumFilters不等于的第一个元素的四倍NumFilters

    • BottleneckType = "没有"而且InitialNumFilters不等于的第一个元素NumFilters

    有关每个剩余块中的层的详细信息,请参见更多关于

    例子:NumFilters=[32 64 126 256]

    数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

    每次数据通过输入层前向传播时应用的数据规范化,指定为以下之一:

    • “zerocenter”-减去平均值。平均值在训练时计算。

    • “zscore”-减去平均值并除以标准偏差。在训练时计算平均值和标准偏差。

    例子:归一化= " zscore "

    数据类型:字符|字符串

    输出参数

    全部折叠

    剩余网络,返回为alayerGraph对象。

    更多关于

    全部折叠

    剩余的网络

    残余网络(ResNets)是一种深度网络,由具有剩余的连接(亦称跳过快捷方式连接)。这些连接允许输入跳过主分支的卷积单元,从而提供了一个更简单的网络路径。通过允许参数梯度更容易地从输出层流向网络的早期层,剩余连接有助于缓解早期训练中梯度消失的问题。

    残差网络的结构是灵活的。关键组件是包含内部的剩余连接剩余块.一组剩余块称为A堆栈.ResNet架构由初始层组成,然后是包含剩余块的堆栈,然后是最终层。一个网络有三种类型的剩余块:

    • 初始剩余块-该块出现在第一个堆栈的开始。初始剩余块的剩余连接中的层决定该块是否保持激活大小或执行下采样。

    • 标准剩余块-在每个堆栈中,在第一个下采样剩余块之后,该块出现多次。标准剩余块保留激活大小。

    • 向下采样剩余块-该块在每个堆栈的开始出现一次。下采样块中的第一个卷积单元将空间维度下采样2倍。

    典型的堆栈有一个下采样剩余块,然后是标准剩余块,其中大于等于1。第一个堆栈是唯一一个以初始剩余块开始的堆栈。

    初始残差块、标准残差块和下采样残差块可以是瓶颈或者是非瓶颈块。瓶颈块在进行3 × 3卷积之前执行1 × 1卷积,从而将通道数量减少到1 / 4。有瓶颈块和没有瓶颈块的网络具有相似的计算复杂度,但是当使用瓶颈单元时,在剩余连接中传播的特征总数要大四倍。因此,使用瓶颈块可以提高网络的效率。

    每个块内部的层由块的类型和您设置的选项决定。

    屏蔽层

    的名字 初始层 初始剩余块 标准剩余块(BottleneckType = " downsample-first-conv " 标准剩余块(BottleneckType = "没有" 下采样残差块 最后一层
    描述

    残差网络依次从以下层开始:

    属性设置可选的池化层InitialPoolingLayer论点。

    初始剩余块的主分支具有与标准剩余块相同的层数。

    InitialNumFilters而且NumFilters值确定剩余连接上的层数。残差连接有一个卷积层[1]过滤和[1]如果满足下列条件之一,则跨步:

    • BottleneckType = " downsample-first-conv "(默认),InitialNumFilters不等于的第一个元素的四倍NumFilters

    • BottleneckType = "没有"而且InitialNumFilters不等于的第一个元素NumFilters

    如果ResidualBlockType设置为“batchnorm-before-add”,残余连接也会有一个批处理归一层。

    带瓶颈单元的标准剩余块按顺序有以下层:

    标准块具有从前一个块的输出到添加层的剩余连接。

    属性设置添加层的位置ResidualBlockType论点。

    无瓶颈单元的标准剩余块按顺序有以下层:

    标准块具有从前一个块的输出到添加层的剩余连接。

    属性设置添加层的位置ResidualBlockType论点。

    下采样残差块与标准块相同(有或没有瓶颈),但步幅为(2, 2)在第一卷积层和附加层上进行残差连接。

    残差连接的层数取决于ResidualBlockType价值。

    下采样块将输入的高度和宽度减半,并增加通道的数量。

    剩余网络以以下层结束,依次为:

    可视化例子

    剩余网络的初始层。

    一个没有瓶颈的网络的初始剩余块的例子,批处理归一化层在添加层之前。

    剩余网络中的初始剩余块示例。

    具有瓶颈的网络的标准剩余块示例,并且在添加层之前有批规范化层。

    带有瓶颈单元的剩余网络中的标准剩余块示例。

    没有瓶颈的网络的标准剩余块示例,并且在添加层之前有批规范化层。

    没有瓶颈单元的剩余网络中的标准剩余块示例。

    没有瓶颈且批归一层在添加层之前的网络的下采样剩余块示例。

    没有瓶颈单元的剩余网络中的下采样剩余块示例。

    剩余网络的最后一层。

    使用He权值初始化方法初始化卷积和全连接层权值[3].有关更多信息,请参见convolution2dLayer

    提示

    • 处理小图像时,设置InitialPoolingLayer选项“没有”去除初始池化层,减少下采样量。

    • 剩余网络通常被命名为ResNet-X,在那里X深度网络的。网络深度定义为从输入层到输出层的一条路径上连续的卷积层或全连接层的最大数量。可以使用以下公式计算网络深度:

      深度= 1 + 2 1 N 年代 + 1 如果没有瓶颈 1 + 3. 1 N 年代 + 1 如果瓶颈

      在哪里年代是堆栈的深度

      相同深度的网络可能具有不同的网络架构。例如,你可以创建一个ResNet-14架构,有或没有瓶颈:

      resnet14Bottleneck = resnetLayers([224 224 3],10,...StackDepth = (2 - 2),...NumFilters = [64 - 128]);resnet14NoBottleneck = resnetLayers([224 224 3],10,...BottleneckType =“没有”...StackDepth=[2 2 2],...NumFilters=[64 128 256]);
      瓶颈和非瓶颈架构之间的关系也意味着有瓶颈的网络与没有瓶颈的网络具有不同的深度。
      resnet50Bottleneck = resnetLayers([224 224 3],10);resnet34NoBottleneck = resnetLayers([224 224 3],10,...BottleneckType =“没有”);

    参考文献

    [1]何开明,张翔宇,任少卿,孙健。图像识别的深度残差学习预印本,2015年12月10日提交。https://arxiv.org/abs/1512.03385。

    [2]何开明,张翔宇,任少卿,孙健。深度残差网络中的身份映射预印本,2016年7月25日提交。https://arxiv.org/abs/1603.05027。

    [3]何开明,张翔宇,任少卿,孙健。“深入研究整流器:在ImageNet分类上超越人类水平的性能。”在2015年IEEE计算机视觉国际会议论文集, 1026 - 1034。华盛顿:IEEE计算机视觉学会,2015。

    扩展功能

    版本历史

    R2021b中引入