主要内容

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

这个例子展示了如何配置一个实验来替换不同的预先训练的网络层来进行迁移学习。迁移学习通常用于深度学习应用。你可以用一个预先训练好的网络作为学习新任务的起点。用迁移学习对网络进行微调通常比用随机初始化权值从头开始训练网络更快、更容易。您可以使用少量的训练图像快速地将学习到的特征转移到新的任务中。

在深度学习工具箱™中有许多预先训练过的网络可用。这些预先训练过的网络具有不同的特征,这些特征在选择网络应用于你的问题时很重要。最重要的特征是网络的准确性、速度和大小。选择一个网络通常是在这些特征之间的权衡。为了比较不同预训练网络的性能,编辑这个实验并指定使用哪一个预训练网络。

这个实验需要深度学习工具箱模型谷歌网金宝app支持包和深度学习工具箱模型ResNet-18网络金宝app支持包。在运行实验之前,通过调用金宝appgooglenetresnet18函数和点击下载链接。有关可从Add-On Explorer下载的其他预训练网络的更多信息,请参见预先训练的深度神经网络

开放实验

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

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

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

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

这个超参数部分指明策略(彻底扫除)和用于实验的超参数值。当您运行实验时,experiment Manager使用超参数表中指定的每个超参数值组合来训练网络。在本例中,超参数网络名指定要训练的网络和训练选项的值“miniBatchSize”

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

  • 加载与超参数对应的预训练网络网络名

networkName=params.networkName;
开关networkName情况下“squeezenet”网= squeezenet;miniBatchSize = 128;情况下“googlenet”网= googlenet;miniBatchSize = 128;情况下“resnet18”网= resnet18;miniBatchSize = 128;情况下“MobileNet V2”网= mobilenetv2;miniBatchSize = 128;情况下“resnet50”网= resnet50;miniBatchSize = 128;情况下“resnet101”网= resnet101;miniBatchSize = 64;情况下“inceptionv3”网= inceptionv3;miniBatchSize = 64;情况下“inceptionresnetv2”net=inceptionresnetv2;miniBatchSize=64;否则错误(“未定义的网络选择。”);结束
  • 下载并提取Flowers数据集,其大小约为218 MB。有关此数据集的更多信息,请参见图像数据集

url ="http://download.tensorflow.org/example_images/flower_photos.tgz";downloadFolder = tempdir;文件名= fullfile (downloadFolder,“flower_dataset.tgz”);
imageFolder = fullfile (downloadFolder,“flower_photos”);如果~exist(imageFolder,“目录”) disp ("下载花卉数据集(218mb)…") websave(文件名,url);解压(文件名,downloadFolder)结束
imd = imageDatastore (imageFolder,...IncludeSubfolders = true,...标签源=“文件夹名称”);
[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9);inputSize = net.Layers (1) .InputSize;augimdsTrain = augmentedImageDatastore (inputSize imdsTrain);augimdsValidation = augmentedImageDatastore (inputSize imdsValidation);
  • 替换预训练网络的可学习层以执行迁移学习。助手功能findLayersToReplace,列于附录2在本例末尾,确定网络体系结构中用于迁移学习的层。有关可用预训练网络的更多信息,请参阅预先训练的深度神经网络

lgraph = layerGraph(净);[learnableLayer, classLayer] = findLayersToReplace (lgraph);numClasses =元素个数(类别(imdsTrain.Labels));
如果isa (learnableLayer“nnet.cnn.layer.FullyConnectedLayer”newLearnableLayer = fullconnectedlayer (numClasses,...名字=“新俱乐部”,...WeightLearnRateFactor = 10,...BiasLearnRateFactor = 10);埃尔塞夫isa (learnableLayer“nnet.cnn.layer.Convolution2DLayer”)newLearnableLayer=卷积2dLayer(1,numClass,...名字=“new_conv”,...WeightLearnRateFactor = 10,...BiasLearnRateFactor = 10);结束
lgraph = replaceLayer (lgraph learnableLayer.Name newLearnableLayer);
newClassLayer = classificationLayer (Name =“new_classoutput”); lgraph=replaceLayer(lgraph,classLayer.Name,newClassLayer);
  • 定义了一个trainingOptions实验对象。该示例训练网络10个周期,初始学习率为0.0003,每5个周期对网络进行验证。

validationFrequencyEpochs = 5;
numObservations = augimdsTrain.NumObservations;numIterationsPerEpoch =地板(numObservations / miniBatchSize);validationFrequency = validationFrequencyEpochs * numIterationsPerEpoch;
选择= trainingOptions (“个”,...MaxEpochs = 10,...MiniBatchSize = MiniBatchSize,...InitialLearnRate = 3的军医,...洗牌=“every-epoch”,...ValidationData = augimdsValidation,...ValidationFrequency = ValidationFrequency,...Verbose = false);

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

这个韵律学节指定对实验结果进行评估的可选函数。本示例不包括任何自定义度量函数。

运行实验

当您运行实验时,实验管理器对设置功能定义的网络进行六次训练。每次试验都使用不同的超参数值组合。默认情况下,实验管理器每次运行一个试验。如果您有并行计算工具箱™,您可以同时运行多个试验。为了获得最好的结果,在您运行您的实验之前,启动一个与gpu一样多的worker的并行池。有关更多信息,请参见使用实验管理器并行训练网络GPU支金宝app持情况(并行计算工具箱)

  • 要一次运行一次实验,请在实验管理器工具条上单击

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

结果表显示了每次试验的准确性和损失。当实验正在进行时,单击训练区展示训练图,并跟踪每次试验的进度。点击混淆矩阵显示每个完成试验验证数据的混淆矩阵。

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

若要测试个别试用的性能,可将受训网络或受训信息导出供试用使用。在实验管理器工具条,选择出口>训练有素的网络出口>培训信息,分别。有关更多信息,请参见信息

近距离实验

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

附录1:设置功能

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

输入

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

输出

  • augimdsTrain是训练数据的增强图像数据存储。

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

  • 选项是一个trainingOptions对象。

函数[augmdstrain,lgraph,options] = TransferLearningExperiment_setup1(params) networkName = params. networkName;开关networkName情况下“squeezenet”网= squeezenet;miniBatchSize = 128;情况下“googlenet”网= googlenet;miniBatchSize = 128;情况下“resnet18”网= resnet18;miniBatchSize = 128;情况下“MobileNet V2”网= mobilenetv2;miniBatchSize = 128;情况下“resnet50”网= resnet50;miniBatchSize = 128;情况下“resnet101”网= resnet101;miniBatchSize = 64;情况下“inceptionv3”网= inceptionv3;miniBatchSize = 64;情况下“inceptionresnetv2”net=inceptionresnetv2;miniBatchSize=64;否则错误(“未定义的网络选择。”);结束url ="http://download.tensorflow.org/example_images/flower_photos.tgz";downloadFolder = tempdir;文件名= fullfile (downloadFolder,“flower_dataset.tgz”);imageFolder = fullfile (downloadFolder,“flower_photos”);如果~exist(imageFolder,“目录”) disp ("下载花卉数据集(218mb)…") websave(文件名,url);解压(文件名,downloadFolder)结束imd = imageDatastore (imageFolder,...IncludeSubfolders = true,...标签源=“文件夹名称”);[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9);inputSize = net.Layers (1) .InputSize;augimdsTrain = augmentedImageDatastore (inputSize imdsTrain);augimdsValidation = augmentedImageDatastore (inputSize imdsValidation);lgraph = layerGraph(净);[learnableLayer, classLayer] = findLayersToReplace (lgraph);numClasses =元素个数(类别(imdsTrain.Labels));如果isa (learnableLayer“nnet.cnn.layer.FullyConnectedLayer”newLearnableLayer = fullconnectedlayer (numClasses,...名字=“新俱乐部”,...WeightLearnRateFactor = 10,...BiasLearnRateFactor = 10);埃尔塞夫isa (learnableLayer“nnet.cnn.layer.Convolution2DLayer”)newLearnableLayer=卷积2dLayer(1,numClass,...名字=“new_conv”,...WeightLearnRateFactor = 10,...BiasLearnRateFactor = 10);结束lgraph = replaceLayer (lgraph learnableLayer.Name newLearnableLayer);newClassLayer = classificationLayer (Name =“new_classoutput”); lgraph=replaceLayer(lgraph,classLayer.Name,newClassLayer);validationFrequencyEpochs=5;numObservations=augimdsTrain.numObservations;numIterationsPerEpoch=楼层(numObservations/miniBatchSize);validationFrequency=validationFrequencyEpochs*numiterationSpeech;选项=培训选项(“个”,...MaxEpochs = 10,...MiniBatchSize = MiniBatchSize,...InitialLearnRate = 3的军医,...洗牌=“every-epoch”,...ValidationData = augimdsValidation,...ValidationFrequency = ValidationFrequency,...Verbose = false);结束

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

该函数查找层图的单个分类层和前面的可学习层(全连接或卷积)lgraph

函数[learnableLayer, classLayer] = findLayersToReplace (lgraph)如果~ isa (lgraph“nnet.cnn.LayerGraph”)错误(Argument必须是LayerGraph对象。)结束src =字符串(lgraph.Connections.Source);dst =字符串(lgraph.Connections.Destination);layerNames =字符串({lgraph.Layers.Name} ');isClassificationLayer = arrayfun(@(左)...(isa(l,“nnet.cnn.layer.ClassificationOutputLayer”)|isa(l,“nnet.layer.ClassificationLayer”)),...lgraph.Layers);如果sum(isClassificationLayer) ~= 1 error(“图层图必须有一个分类图层。”)结束classLayer = lgraph.Layers (isClassificationLayer);currentLayerIdx =找到(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);结束结束

另见

应用程序

功能

相关的话题