Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

resnet18

ResNet-18 卷积神经网络

  • ResNet-18 network architecture

说明

ResNet-18 是深度为 18 层的卷积神经网络。您可以从 ImageNet 数据库 [1] 中加载该网络的预训练版本,该版本基于 ImageNet 数据库的超过一百万个图像进行训练。该预训练网络可以将图像分类至 1000 个目标类别(例如键盘、鼠标、铅笔和多种动物)。因此,该网络已基于大量图像学习了丰富的特征表示。该网络的图像输入大小为 224×224。有关 MATLAB® 中预训练网络的详细信息,请参阅预训练的深度神经网络

您可以通过 classify 使用 ResNet-18 模型对新图像进行分类。按照使用 GoogLeNet 对图像进行分类的步骤执行操作,但是用 ResNet-18 替换 GoogLeNet。

要针对新分类任务重新训练网络,请按照训练深度学习网络以对新图像进行分类的步骤操作,但是加载 ResNet-18 而不是 GoogLeNet。

提示

要创建适合图像分类任务的未经训练的残差网络,请使用 resnetLayers

示例

net = resnet18 返回基于 ImageNet 数据集训练的 ResNet-18 网络。

此函数需要 Deep Learning Toolbox™ Model for ResNet-18 Network 支持包。如果未安装此支持包,则函数会提供下载链接。

net = resnet18('Weights','imagenet') 返回基于 ImageNet 数据集训练的 ResNet-18 网络。此语法等效于 net = resnet18

lgraph = resnet18('Weights','none') 返回未经训练的 ResNet-18 网络架构。未经训练的模型不需要支持包。

示例

全部折叠

下载并安装 Deep Learning Toolbox Model for ResNet-18 Network 支持包。

在命令行中键入 resnet18

resnet18

如果未安装 Deep Learning Toolbox Model for ResNet-18 Network 支持包,该函数将在附加功能资源管理器中提供所需支持包的链接。要安装支持包,请点击链接,然后点击安装。通过在命令行中键入 resnet18 来检查安装是否成功。如果安装了所需的支持包,则该函数返回 DAGNetwork 对象。

resnet18
ans = 

  DAGNetwork with properties:

         Layers: [72×1 nnet.cnn.layer.Layer]
    Connections: [79×2 table]

使用深度网络设计器可视化网络。

deepNetworkDesigner(resnet18)

通过点击新建,在深度网络设计器中浏览其他预训练神经网络。

Deep Network Designer start page showing available pretrained neural networks

如果需要下载一个神经网络,请在所需的神经网络上暂停,然后点击安装以打开附加功能资源管理器。

加载一个预训练的 ResNet-18 模型。

net = resnet18;

使用 imread 读取一个测试图像。

I = imread("peppers.png");
imshow(I)

Figure contains an axes object. The axes object contains an object of type image.

预训练模型要求图像大小与网络的输入大小相同。使用网络第一层的 InputSize 属性确定网络的输入大小。

sz = net.Layers(1).InputSize
sz = 1×3

   224   224     3

将图像大小调整为网络的输入大小。

I = imresize(I,sz(1:2));

使用 classify 对图像进行分类。

label = classify(net,I)
label = categorical
     bell pepper 

将图像和分类结果一起显示。

imshow(I)
title(label)

Figure contains an axes object. The axes object with title bell pepper contains an object of type image.

在工作区中,提取 MathWorks Merch 数据集。

unzip("MerchData.zip");

打开深度网络设计器查看可用的预训练网络。

deepNetworkDesigner

选择 ResNet-18 并点击打开。如果未安装 Deep Learning Toolbox™ Model for ResNet-18 Network,则软件会打开附加功能资源管理器

要将数据加载到深度网络设计器中,请在数据选项卡上,点击导入数据 > 导入图像分类数据。在数据源列表中,选择文件夹。点击浏览并选择提取的 MerchData 文件夹。

将数据划分为训练数据集和验证数据集。将 70% 的图像用于训练,30% 的图像用于验证。选择随机化以将指定比例的图像随机分配给验证集和训练集。

点击导入将数据导入深度网络设计器。

该 App 显示导入数据的摘要。

要对预训练网络进行重新训练以对新图像进行分类,请使最后一个可学习层和最终分类层适应新数据集。

设计器选项卡中,点击最终全连接层。在属性窗格的底部,点击解锁层。在出现的警告对话框中,点击仍要解锁。这将解锁层属性,以便您可以使其适应新任务。

在 R2023b 之前:要编辑层属性,您必须替换层,而不是解锁层。

OutputSize 设置为新数据中的类数量,此示例中为 5。编辑学习率,以使新层中的学习速度快于迁移层的学习速度。将 WeightLearnRateFactorBiasLearnRateFactor 设置为 10

选择分类层并点击解锁层,然后点击仍要解锁。对于解锁的输出层,不需要设置 OutputSize。在训练时,深度网络设计器会根据数据自动设置层的输出类。

指定训练选项。选择训练选项卡,然后点击训练选项。将求解器设置为 sgdmInitialLearnRate 设置为 0.0001MiniBatchSize 设置为 11MaxEpochs 设置为 8,以及 ValidationFrequency 设置为 5

要使用指定的训练选项训练网络,请点击确定,然后点击训练

要导出具有训练权重的网络架构,请在训练选项卡上,选择导出 > 导出经过训练的网络和结果。深度网络设计器将经过训练的网络导出为变量 trainedNetwork_1

加载一个新图像以使用经过训练的网络对其进行分类。

I = imread("MerchDataTest.jpg");

深度网络设计器会在训练期间调整图像大小,以匹配网络输入大小。要查看网络输入大小,请转至设计器窗格,然后选择 imageInputLayer(第一层)。此网络的输入大小为 224×224。

调整测试图像的大小以匹配网络输入大小。

I = imresize(I,[224 224]);

使用经过训练的网络对测试图像进行分类。

YPred = classify(trainedNetwork_1,I);
imshow(I)
title("Predicted Class: " + string(YPred));

加载预训练的 ResNet-18 神经网络,并找到输入大小。

net = resnet18;
inputSize = net.Layers(1).InputSize;

提取 MathWorks Merch 数据集。加载新图像作为一个图像数据存储。

unzip("MerchData.zip");
imds = imageDatastore("MerchData", ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

numClasses = numel(categories(imds.Labels));

将数据划分为训练数据集和验证数据集。指定 "randomized" 以将指定比例的图像随机分配给验证集和训练集。

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,"randomized");

使用增强的图像数据存储来自动调整训练图像的大小以匹配网络的输入大小。

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

要对预训练网络进行重新训练以对新图像进行分类,请将最后一个全连接层和最终分类层替换为适应新数据集的新层。首先,从经过训练的网络中提取层图。

lgraph = layerGraph(net); 

将全连接层替换为新的全连接层,其中输出的数量等于类的数量。要使新层中的学习速度快于迁移的层,请增大全连接层的 WeightLearnRateFactorBiasLearnRateFactor 值。

newLearnableLayer = fullyConnectedLayer(numClasses, ...
    WeightLearnRateFactor=10, ...
    BiasLearnRateFactor=10);
    
lgraph = replaceLayer(lgraph,"fc1000",newLearnableLayer);

分类层指定网络的输出类。将分类层替换为没有类标签的新层。trainNetwork 会在训练时自动设置层的输出类。

newClassLayer = classificationLayer;
lgraph = replaceLayer(lgraph,"ClassificationLayer_predictions",newClassLayer);

指定训练选项。要减慢迁移的层中的学习速度,请将初始学习速率设置为较小的值。

options = trainingOptions("sgdm", ...
    InitialLearnRate=0.0001, ...
    MiniBatchSize=11, ...
    MaxEpochs=8, ...
    ValidationData=augimdsValidation, ...
    ValidationFrequency=5, ...
    Verbose=false, ...
    Plots="training-progress");

训练网络。

trainedNetwork = trainNetwork(augimdsTrain,lgraph,options);

Figure Training Progress (19-Aug-2023 11:40:06) contains 2 axes objects and another object of type uigridlayout. Axes object 1 with xlabel Iteration, ylabel Loss contains 15 objects of type patch, text, line. Axes object 2 with xlabel Iteration, ylabel Accuracy (%) contains 15 objects of type patch, text, line.

加载一个新图像以使用经过训练的网络对其进行分类。

I = imread("MerchDataTest.jpg");
I = imresize(I,inputSize(1:2));

对测试图像进行分类。

YPred = classify(trainedNetwork,I);
imshow(I)
title("Predicted class: " + string(YPred));

Figure contains an axes object. The axes object with title Predicted class: MathWorks Cube contains an object of type image.

输出参数

全部折叠

预训练的 ResNet-18 卷积神经网络,以 DAGNetwork 对象形式返回。

未经训练的 ResNet-18 卷积神经网络架构,以 LayerGraph 对象形式返回。

参考

[1] ImageNet. http://www.image-net.org

[2] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Deep residual learning for image recognition." In Proceedings of the IEEE conference on computer vision and pattern recognition, pp. 770-778. 2016.

扩展功能

版本历史记录

在 R2018a 中推出