主要内容

尝试使用多个预训练网络进行迁移学习

此示例演示如何配置一个实验,替换不同预训练网络的层,以进行迁移学习。迁移学习通常用于深度学习应用。你可以把一个预先训练好的网络作为学习新任务的起点。使用转移学习对网络进行微调通常比从头开始使用随机初始化权重训练网络要快得多,也容易得多。您可以使用较少数量的训练图像将学习到的功能快速传输到新任务。

深度学习工具箱中有许多预训练网络可用™. 这些预训练网络具有不同的特征,在选择网络应用于您的问题时,这些特征很重要。最重要的特征是网络精度、速度和规模。选择网络通常是在这些特性之间进行权衡。要比较任务中不同预训练网络的性能,请编辑此实验并指定要使用的预训练网络。

这个实验需要深度学习工具箱模型谷歌网万博1manbetx支持包和深度学习工具箱模型针对ResNet-18网络万博1manbetx在运行实验之前,通过调用水壶resnet18函数并单击下载链接。有关可从附加模块资源管理器下载的其他预训练网络的更多信息,请参阅预训练深度神经网络.

开放实验

首先,打开示例。实验经理加载带有预配置实验的项目,您可以检查并运行该实验实验浏览器窗格中,双击实验的名称(迁移学习实验).

内置训练实验包括描述、超参数表、设置函数和用于评估实验结果的度量函数集合。有关更多信息,请参阅配置内建训练实验.

这个描述字段包含实验的文本描述。对于本例,描述为:

通过替换预训练网络中的层来执行迁移学习。

这个超参数第节指定了策略(彻底扫除)和用于实验的超参数值。运行实验时,实验管理器使用超参数表中指定的超参数值的每个组合来训练网络。在本例中,超参数网络名指定要训练的网络和训练选项的值“miniBatchSize”.

这个设置功能配置实验的训练数据、网络体系结构和训练选项。设置函数的输入是一个包含超参数表字段的结构。设置函数返回三个输出,用于训练网络解决图像分类问题。在本例中,设置函数:

  • 加载与hyperparameter对应的预训练网络网络名.

networkName=params.networkName;
转换网络名案例“挤压网”net=挤压网;miniBatchSize=128;案例“谷歌网”net=googlenet;miniBatchSize=128;案例“resnet18”net=resnet18;miniBatchSize=128;案例“MobileNet V2”net=mobilenetw2;miniBatchSize=128;案例“resnet50”net=resnet50;miniBatchSize=128;案例“resnet101”net=resnet101;miniBatchSize=64;案例“接收v3”net=inceptionv3;miniBatchSize=64;案例“接收resnetv2”net=inceptionresnetv2;miniBatchSize=64;否则错误(“未定义的网络选择。”);终止
  • 下载并提取Flowers数据集,约218MB。有关此数据集的更多信息,请参阅图像数据集.

网址="http://download.tensorflow.org/example_images/flower_photos.tgz";downloadFolder=tempdir;filename=fullfile(downloadFolder,“flower_dataset.tgz”);
imageFolder=fullfile(下载文件夹,“花卉照片”);如果~exist(imageFolder,“目录”)disp(“正在下载花卉数据集(218MB))websave(文件名、url);untar(文件名,下载文件夹)终止
imds=图像数据存储(图像文件夹,...IncludeSubfolders=true,...标签源=“文件夹名称”);
[imdsTrain,imdsValidation]=splitEachLabel(imds,0.9);inputSize=net.Layers(1)。inputSize;augimdsTrain=AugmentImageDatastore(inputSize,imdsTrain);augimdsValidation=AugmentImageDatastore(inputSize,imdsValidation);
  • 替换预训练网络的可学习层以执行迁移学习。助手功能FindlayerStore酒店,已在中列出附录2在本例末尾,确定网络体系结构中用于迁移学习的层。有关可用预训练网络的更多信息,请参阅预训练深度神经网络.

lgraph=层图(净);[learnableLayer,classLayer]=FindLayerStore(lgraph);numClasses=numel(类别(imdsTrain.Labels));
如果isa(learnableLayer,“nnet.cnn.layer.FullyConnectedLayer”)newLearnableLayer=fullyConnectedLayer(NumClass,...名字=“新俱乐部”,...WeightLearnRateFactor=10,...BiasLearnRateFactor=10);埃尔塞夫isa(learnableLayer,“nnet.cnn.layer.Convolution2DLayer”)newLearnableLayer=卷积2dLayer(1,numClass,...名字=“新会议”,...WeightLearnRateFactor=10,...BiasLearnRateFactor=10);终止
lgraph=replaceLayer(lgraph,learnableLayer.Name,newLearnableLayer);
newClassLayer=classificationLayer(名称=“新类输出”); lgraph=replaceLayer(lgraph,classLayer.Name,newClassLayer);
  • 定义一个培训选项该示例使用0.0003的初始学习率对网络进行10个阶段的训练,并每5个阶段验证一次网络。

validationFrequencyEpochs=5;
numObservations=augimdsTrain.numObservations;numIterationsPerEpoch=floor(numObservations/miniBatchSize);validationFrequency=validationFrequencyEpochs*numIterationsPerEpoch;
选项=培训选项(“sgdm”,...MaxEpochs=10,...MiniBatchSize=MiniBatchSize,...InitialLearnRate=3e-4,...洗牌=“每个时代”,...ValidationData=augimdsValidation,...ValidationFrequency=ValidationFrequency,...冗长=错误);

要检查设置功能,请在设置功能点击编辑。设置功能将在MATLAB®编辑器中打开。此外,设置功能的代码将显示在中附录1在这个例子的末尾。

这个韵律学部分指定用于评估实验结果的可选函数。此示例不包括任何自定义度量函数。

运行实验

运行该实验时,实验管理器会对设置函数定义的网络进行六次训练。每个试验都使用不同的超参数值组合。默认情况下,实验管理器一次运行一个试验。如果您有并行计算工具箱™, 您可以同时运行多个试验。为了获得最佳结果,在运行试验之前,请启动一个具有GPU数量的并行池。有关更多信息,请参阅使用实验管理器并行训练网络GPU版万博1manbetx本支持(并行计算工具箱).

  • 要一次运行一次试验,请在“试验管理器”工具栏上单击.

  • 要同时运行多个试用,请单击使用并行然后。如果当前没有并行池,则“实验管理器”将使用默认群集配置文件启动一个并行池。然后,“实验管理器”将根据可用的并行工作线程数同时执行多个试验。

结果表显示每个试验的准确度和损失。在试验运行时,单击训练区显示训练图并跟踪每个试验的进度。单击混淆矩阵显示每个已完成试验中验证数据的混淆矩阵。

实验完成后,您可以按列对结果表进行排序,使用过滤器窗格,或通过添加批注记录观察结果。有关更多信息,请参阅对实验结果进行排序、筛选和注释.

要测试单个试验的性能,请导出经过培训的网络或试验的培训信息。在实验经理工具条,选择出口>训练有素的网络出口>培训信息分别地有关详细信息,请参阅信息.

近距离实验

实验浏览器窗格中,右键单击项目名称并选择关闭项目. 实验管理器关闭项目中包含的所有实验和结果。

附录1:设置功能

此函数用于配置实验的训练数据、网络体系结构和训练选项。

输入

  • params是一个结构,包含来自实验管理器超参数表的字段。

输出

  • 奥吉姆德斯特兰是用于训练数据的增强图像数据存储。

  • lgraph是定义神经网络体系结构的层图。

  • 选择权是一个培训选项对象

作用[augimdsTrain,lgraph,options]=TransferLearningExperiment_setup1(params)networkName=params.networkName;转换网络名案例“挤压网”net=挤压网;miniBatchSize=128;案例“谷歌网”net=googlenet;miniBatchSize=128;案例“resnet18”net=resnet18;miniBatchSize=128;案例“MobileNet V2”net=mobilenetw2;miniBatchSize=128;案例“resnet50”net=resnet50;miniBatchSize=128;案例“resnet101”net=resnet101;miniBatchSize=64;案例“接收v3”net=inceptionv3;miniBatchSize=64;案例“接收resnetv2”net=inceptionresnetv2;miniBatchSize=64;否则错误(“未定义的网络选择。”);终止网址="http://download.tensorflow.org/example_images/flower_photos.tgz";downloadFolder=tempdir;filename=fullfile(downloadFolder,“flower_dataset.tgz”); imageFolder=fullfile(下载文件夹,“花卉照片”);如果~exist(imageFolder,“目录”)disp(“正在下载花卉数据集(218MB))websave(文件名、url);untar(文件名,下载文件夹)终止imds=图像数据存储(图像文件夹,...IncludeSubfolders=true,...标签源=“文件夹名称”);[imdsTrain,imdsValidation]=splitEachLabel(imds,0.9);inputSize=net.Layers(1)。inputSize;augimdsTrain=AugmentImageDatastore(inputSize,imdsTrain);augimdsValidation=AugmentImageDatastore(inputSize,imdsValidation);lgraph=layerGraph(net);[learnableLayer,classLayer]=FindLayerStore(lgraph);numClasses=numel(categories)(imdsTrain.Labels));如果isa(learnableLayer,“nnet.cnn.layer.FullyConnectedLayer”)newLearnableLayer=fullyConnectedLayer(NumClass,...名字=“新俱乐部”,...WeightLearnRateFactor=10,...BiasLearnRateFactor=10);埃尔塞夫isa(learnableLayer,“nnet.cnn.layer.Convolution2DLayer”)newLearnableLayer=卷积2dLayer(1,numClass,...名字=“新会议”,...WeightLearnRateFactor=10,...BiasLearnRateFactor=10);终止lgraph=replaceLayer(lgraph,learnableLayer.Name,newLearnableLayer);newClassLayer=classificationLayer(名称=“新类输出”); lgraph=replaceLayer(lgraph,classLayer.Name,newClassLayer);validationFrequencyEpochs=5;numObservations=augimdsTrain.numObservations;numIterationsPerEpoch=楼层(numObservations/miniBatchSize);validationFrequency=validationFrequencyEpochs*numiterationSpeech;选项=培训选项(“sgdm”,...MaxEpochs=10,...MiniBatchSize=MiniBatchSize,...InitialLearnRate=3e-4,...洗牌=“每个时代”,...ValidationData=augimdsValidation,...ValidationFrequency=ValidationFrequency,...冗长=错误);终止

附录2:查找要替换的图层

此函数用于查找层图的单个分类层和前一个可学习(完全连接或卷积)层lgraph.

作用[learnableLayer,classLayer]=FindLayerStoreReplace(lgraph)如果~isa(lgraph,“nnet.cnn.LayerGraph”)错误(“参数必须是LayerGraph对象。”)终止src=字符串(lgraph.Connections.Source);dst=字符串(lgraph.Connections.Destination);layerNames=string({lgraph.Layers.Name}');isClassificationLayer=arrayfun(@(l)...(isa(l,“nnet.cnn.layer.ClassificationOutputLayer”)|isa(l,“nnet.layer.ClassificationLayer”)),...层);如果总和(isClassificationLayer)~=1错误(“图层图必须有一个分类图层。”)终止classLayer=lgraph.Layers(isClassificationLayer);currentLayerIdx=find(isClassificationLayer);虽然符合事实的如果numel(currentLayerIdx)~=1错误(“图层图必须在分类层之前有一个可学习的层。”)终止currentLayerType=class(lgraph.Layers(currentLayerIdx));isLearnableLayer=ismember(currentLayerType,...[“nnet.cnn.layer.FullyConnectedLayer”,“nnet.cnn.layer.Convolution2DLayer”]);如果isLearnableLayer learnableLayer=lgraph.Layers(currentLayerIdx);回来终止currentDstIdx=find(layerNames(currentLayerIdx)==dst);currentLayerIdx=find(src(currentDstIdx)==layerNames);终止终止

另见

应用程序

功能

相关话题