本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

迁移学习快速入门

此示例说明如何使用迁移学习来重新训练 ResNet-18 预训练卷积神经网络以对新图像集进行分类。尝试此示例以了解在 MATLAB® 中进行深度学习有多么简单。

深度学习应用中常常用到迁移学习。您可以采用预训练的网络,基于它学习新任务。与使用随机初始化的权重从头训练网络相比,通过迁移学习微调网络要更快更简单。您可以使用较少数量的训练图像快速地将已学习的特征迁移到新任务。

加载数据

解压缩新图像并加载这些图像作为图像数据存储。将数据划分为训练数据集和验证数据集。将 70% 的图像用于训练,30% 的图像用于验证。

unzip('MerchData.zip');
imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

加载预训练网络

加载预训练的 ResNet-18 网络。如果未安装 Deep Learning Toolbox™ Model for ResNet-18 Network,则软件会提供下载链接。ResNet-18 已基于超过一百万个图像进行训练,可以将图像分为 1000 个对象类别(例如键盘、咖啡杯、铅笔和多种动物)。该网络已基于大量图像学习了丰富的特征表示。网络以图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。要使用不同的预训练网络执行迁移学习,请参阅训练深度学习网络以对新图像进行分类

net = resnet18;

替换最终层

要重新训练 ResNet-18 以对新图像进行分类,请替换网络的最后一个全连接层和最终分类层。在 ResNet-18 中,这两个层的名称分别为 'fc1000''ClassificationLayer_predictions'。将新的全连接层设置为大小与新数据集中的类数相同(此示例中为 5)。要使新层中的学习速度快于迁移的层,请增大全连接层的学习率因子。

numClasses = numel(categories(imdsTrain.Labels));
lgraph = layerGraph(net);

newFCLayer = fullyConnectedLayer(numClasses,'Name','new_fc','WeightLearnRateFactor',10,'BiasLearnRateFactor',10);
lgraph = replaceLayer(lgraph,'fc1000',newFCLayer);

newClassLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassLayer);

训练网络

网络要求输入图像的大小为 224×224×3,但图像数据存储中的图像具有不同大小。使用增强的图像数据存储可自动调整训练图像的大小。您还可以使用 imageDataAugmenter 指定要对训练图像执行的额外增强操作,以帮助防止网络过拟合。

inputSize = net.Layers(1).InputSize;
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

指定训练选项,包括小批量大小和验证数据。将 InitialLearnRate 设置为较小的值以减慢迁移层中的学习速度。在上一步中,您增大了全连接层的学习率因子,以加快新的最终层中的学习速度。这种学习率设置组合只会加快新层中的学习速度,对于其他层则会减慢学习速度。

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',8, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',5, ...
    'Verbose',false, ...
    'Plots','training-progress');

使用训练数据训练网络。默认情况下,如果有 GPU 可用,trainNetwork 就会使用 GPU(需要 Parallel Computing Toolbox™ 和具有 3.0 或更高计算能力的支持 CUDA® 的 GPU)。否则,将使用 CPU。

trainedNet = trainNetwork(augimdsTrain,lgraph,options);

对验证图像进行分类

使用经过微调的网络对验证图像进行分类,并计算分类准确度。

YPred = classify(trainedNet,augimdsValidation);
accuracy = mean(YPred == imdsValidation.Labels)
accuracy = 1

了解更多信息

要使用不同的预训练网络执行迁移学习,请参阅训练深度学习网络以对新图像进行分类。要尝试使用 Deep Network Designer 进行迁移学习,请参阅Transfer Learning with Deep Network Designer。有关预训练网络的列表和比较,请参阅Pretrained Deep Neural Networks

参考

[1] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Advances in neural information processing systems. 2012.

[2] BVLC AlexNet Model. https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet

另请参阅

| |

相关主题