resnetLayers
创建二维剩余网络
描述
创建一个二维残差网络,其图像输入大小为lgraph
= resnetLayers (inputSize
,numClasses
)inputSize
和指定的许多类numClasses
.剩余网络由一堆块组成。每个块包含深度学习层。该网络包括图像分类层,适用于预测输入图像的分类标签。
要创建三维剩余网络,请使用resnet3dLayers
.
例子
有瓶颈的剩余网络
使用瓶颈架构创建剩余网络。
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
对象
要使用自定义训练循环训练残差网络,首先将其转换为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。
输入参数
inputSize
- - - - - -网络输入图像大小
2-element向量|转换向量
网络输入图像大小,指定为以下之一:
形式为[的2元向量高度,宽度].
形式为[的3元向量高度,宽度,深度),深度是通道数。集深度来
3.
用于RGB图像和到1
对于灰度图像。对于多光谱和高光谱图像,设置深度到通道数。
的高度而且宽度值必须大于或等于initialStride * poolingStride * 2D,在那里D是下采样块的数量。属性设置初始步幅InitialStride
论点。池化步幅是1
当InitialPoolingLayer
设置为“没有”
,2
否则。
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
numClasses
- - - - - -类数
大于1的整数
图像分类网络中的类数,指定为大于1的整数。
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里的名字
参数名称和价值
对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。
例子:InitialFilterSize = [5,5], InitialNumFilters = 32, BottleneckType =“没有”
指定5 × 5像素的初始过滤器大小、32个初始过滤器以及没有瓶颈组件的网络架构。
InitialFilterSize
- - - - - -第一卷积层的过滤器大小
7
(默认)|正整数|正整数的2元向量
第一个卷积层中的过滤器大小,指定为以下之一:
正整数。过滤器具有相等的高度和宽度。例如,指定
5
产生一个高5和宽5的过滤器。形式为[的2元向量高度,宽度].例如,指定的初始过滤器大小为
(1 - 5)
生成一个高为1,宽为5的过滤器。
例子:InitialFilterSize = (5, 5)
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
InitialNumFilters
- - - - - -第一卷积层的过滤器数量
64
(默认)|正整数
第一卷积层中的过滤器数量,指定为正整数。初始滤波器的数量决定了剩余网络中第一个卷积层输出中的通道(特征映射)的数量。
例子:InitialNumFilters = 32
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
InitialStride
- - - - - -在第一卷积层中大步前进
2
(默认)|正整数|正整数的2元向量
在第一卷积层中的Stride,指定为a:
正整数。步幅高度和宽度相等。例如,指定
3.
产生高3和宽3的步幅。形式为[的2元向量高度,宽度].例如,指定的初始步幅
(1 2)
产生高为1,宽为2的步幅。
stride定义垂直和水平遍历输入的步长。
例子:InitialStride =(3、3)
数据类型:单
|双
|int8
|int16
|int32
|int64
|uint8
|uint16
|uint32
|uint64
InitialPoolingLayer
- - - - - -第一池化层
“马克斯”
(默认)|“平均”
|“没有”
初始剩余块之前的第一个池化层,指定为以下之一:
“马克斯”
-在初始剩余块之前使用最大池化层。有关更多信息,请参见maxPooling2dLayer
.“平均”
-在初始剩余块之前使用平均池化层。有关更多信息,请参见averagePooling2dLayer
.“没有”
—不要在初始剩余块之前使用池化层。
例子:InitialPoolingLayer =“平均”
数据类型:字符
|字符串
ResidualBlockType
- - - - - -残块类型
“batchnorm-before-add”
(默认)|“batchnorm-after-add”
BottleneckType
- - - - - -块瓶颈类型
“downsample-first-conv”
(默认)|“没有”
块瓶颈类型,指定为以下之一:
“downsample-first-conv”
-使用瓶颈残差块,在残差块的第一卷积层中执行降采样,使用2的步幅。瓶颈残差块由三个卷积层组成:1 × 1层向下采样信道维度,3 × 3卷积层,1 × 1层向上采样信道维度。最后一个卷积层的过滤器数量是前两个卷积层的4倍。有关更多信息,请参见
NumFilters
.“没有”
—不要使用瓶颈残留块。剩余块由两个3 × 3的卷积层组成。
瓶颈块在进行3 × 3卷积之前执行1 × 1卷积,从而将通道数量减少到1 / 4。有瓶颈块和没有瓶颈块的网络具有相似的计算复杂度,但是当使用瓶颈单元时,在剩余连接中传播的特征总数要大四倍。因此,使用瓶颈可以提高网络的效率[1].有关每个剩余块中的层的更多信息,请参见更多关于.
例子:BottleneckType = "没有"
数据类型:字符
|字符串
StackDepth
- - - - - -每个堆栈中的剩余块数
[3 4 6 3]
(默认)|正整数向量
每个堆栈中的剩余块数,指定为正整数向量。例如,如果堆栈深度为[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
NumFilters
- - - - - -每个堆栈的卷积层中的过滤器数量
[64 128 256 512]
(默认)|正整数向量
每个堆栈的卷积层中的过滤器数量,指定为正整数向量。
当你设置
BottleneckType
来“downsample-first-conv”
,每个堆栈的每个块中的前两个卷积层具有相同数量的过滤器,由NumFilters
价值。最后一个卷积层的过滤器数量是前两个卷积层的4倍。例如,假设你设
NumFilters
来5 [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”
每次数据通过输入层前向传播时应用的数据规范化,指定为以下之一:
“zerocenter”
-减去平均值。平均值在训练时计算。“zscore”
-减去平均值并除以标准偏差。在训练时计算平均值和标准偏差。
例子:归一化= " zscore "
数据类型:字符
|字符串
输出参数
lgraph
—剩余网络
layerGraph
对象
剩余网络,返回为alayerGraph
对象。
更多关于
剩余的网络
残余网络(ResNets)是一种深度网络,由具有剩余的连接(亦称跳过或快捷方式连接)。这些连接允许输入跳过主分支的卷积单元,从而提供了一个更简单的网络路径。通过允许参数梯度更容易地从输出层流向网络的早期层,剩余连接有助于缓解早期训练中梯度消失的问题。
残差网络的结构是灵活的。关键组件是包含内部的剩余连接剩余块.一组剩余块称为A堆栈.ResNet架构由初始层组成,然后是包含剩余块的堆栈,然后是最终层。一个网络有三种类型的剩余块:
初始剩余块-该块出现在第一个堆栈的开始。初始剩余块的剩余连接中的层决定该块是否保持激活大小或执行下采样。
标准剩余块-在每个堆栈中,在第一个下采样剩余块之后,该块出现多次。标准剩余块保留激活大小。
向下采样剩余块-该块在每个堆栈的开始出现一次。下采样块中的第一个卷积单元将空间维度下采样2倍。
典型的堆栈有一个下采样剩余块,然后是米
标准剩余块,其中米
大于等于1。第一个堆栈是唯一一个以初始剩余块开始的堆栈。
初始残差块、标准残差块和下采样残差块可以是瓶颈或者是非瓶颈块。瓶颈块在进行3 × 3卷积之前执行1 × 1卷积,从而将通道数量减少到1 / 4。有瓶颈块和没有瓶颈块的网络具有相似的计算复杂度,但是当使用瓶颈单元时,在剩余连接中传播的特征总数要大四倍。因此,使用瓶颈块可以提高网络的效率。
每个块内部的层由块的类型和您设置的选项决定。
屏蔽层
的名字 | 初始层 | 初始剩余块 | 标准剩余块(BottleneckType = " downsample-first-conv " ) |
标准剩余块(BottleneckType = "没有" ) |
下采样残差块 | 最后一层 |
描述 | 残差网络依次从以下层开始:
属性设置可选的池化层 |
初始剩余块的主分支具有与标准剩余块相同的层数。 的
如果 |
带瓶颈单元的标准剩余块按顺序有以下层:
标准块具有从前一个块的输出到添加层的剩余连接。 属性设置添加层的位置 |
无瓶颈单元的标准剩余块按顺序有以下层:
标准块具有从前一个块的输出到添加层的剩余连接。 属性设置添加层的位置 |
下采样残差块与标准块相同(有或没有瓶颈),但步幅为 残差连接的层数取决于
下采样块将输入的高度和宽度减半,并增加通道的数量。 |
剩余网络以以下层结束,依次为: |
可视化例子 |
|
一个没有瓶颈的网络的初始剩余块的例子,批处理归一化层在添加层之前。 |
具有瓶颈的网络的标准剩余块示例,并且在添加层之前有批规范化层。 |
没有瓶颈的网络的标准剩余块示例,并且在添加层之前有批规范化层。 |
没有瓶颈且批归一层在添加层之前的网络的下采样剩余块示例。 |
|
使用He权值初始化方法初始化卷积和全连接层权值[3].有关更多信息,请参见convolution2dLayer
.
提示
处理小图像时,设置
InitialPoolingLayer
选项“没有”
去除初始池化层,减少下采样量。剩余网络通常被命名为ResNet-X,在那里X是深度网络的。网络深度定义为从输入层到输出层的一条路径上连续的卷积层或全连接层的最大数量。可以使用以下公式计算网络深度:
在哪里年代我是堆栈的深度我.
相同深度的网络可能具有不同的网络架构。例如,你可以创建一个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。
扩展功能
GPU代码生成
使用GPU Coder™为NVIDIA®GPU生成CUDA®代码。
使用注意事项和限制:
您可以使用剩余网络来生成代码。方法创建网络resnetLayers
函数。然后,使用trainNetwork
训练网络的功能。在训练和评估网络之后,您可以为DAGNetwork
对象使用GPU Coder™。
版本历史
R2021b中引入
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。