主要内容

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

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

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

本实验需要深度学习工具箱模型为GoogLeNet网络万博1manbetx支持包和深度学习工具箱模型ResNet-18网络万博1manbetx支持包。在运行实验之前,通过调用万博1manbetxgooglenet而且resnet18函数和点击下载链接。有关可从Add-On资源管理器下载的其他预训练网络的详细信息,请参见预训练的深度神经网络

开放实验

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

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

描述字段包含实验的文本描述。对于本例,描述如下:

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

Hyperparameters部分指定策略(详尽的扫描)和用于实验的超参数值。运行实验时,“实验管理器”将使用超参数表中指定的超参数值的每个组合来训练网络。在本例中,是超参数NetworkName指定要训练的网络和训练选项的值miniBatchSize

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

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

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

url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile(下载文件夹,“flower_dataset.tgz”);
imageFolder = fullfile(下载文件夹,“flower_photos”);如果~存在(imageFolder“dir”) disp ("正在下载花卉数据集(218 MB)…") websave(文件名,url);解压(文件名,downloadFolder)结束
imds = imageDatastore(imageFolder,...IncludeSubfolders = true,...LabelSource =“foldernames”);
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.9);inputSize = net.Layers(1).InputSize;augimdsTrain = augmentedimagedastore (inputSize,imdsTrain);augimdsValidation = augmentedImageDatastore(inputSize,imdsValidation);
  • 替换预训练网络的可学习层,进行迁移学习。辅助函数findLayersToReplace,在附录2在本例的最后,确定了网络架构中要替换的层进行迁移学习。有关可用的预训练网络的更多信息,请参见预训练的深度神经网络

lgraph = layerGraph(net);[learnableLayer,classLayer] = findLayersToReplace(lgraph);numClasses = numel(categories(imdsTrain.Labels));
如果isa (learnableLayer“nnet.cnn.layer.FullyConnectedLayer”) newLearnableLayer = fullyConnectedLayer(numClasses,...Name =“new_fc”...WeightLearnRateFactor = 10,...BiasLearnRateFactor = 10);elseifisa (learnableLayer“nnet.cnn.layer.Convolution2DLayer”) newLearnableLayer = convolution2dLayer(1,numClasses,...Name =“new_conv”...WeightLearnRateFactor = 10,...BiasLearnRateFactor = 10);结束
lgraph = replaceLayer(lgraph,learnableLayer.Name,newLearnableLayer);
newClassLayer = classificationLayer(Name=“new_classoutput”);lgraph = replaceLayer(lgraph,classLayer.Name,newClassLayer);
  • 定义了一个trainingOptions实验对象。该示例使用初始学习率0.0003训练网络10个epoch,并每5个epoch验证一次网络。

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

要检查设置功能,请按设置函数,点击编辑.在MATLAB®编辑器中打开设置函数。此外,设置函数的代码出现在附录1在这个例子的最后。

指标节指定评估实验结果的可选函数。此示例不包括任何自定义度量函数。

运行实验

当您运行实验时,实验管理器将对由设置函数定义的网络进行六次训练。每次试验使用不同的超参数值组合。默认情况下,实验管理器每次运行一个试验。如果您有并行计算工具箱™,您可以同时运行多个试验,或者将试验卸载为集群中的批处理作业。

  • 每次进行一个试验,在实验管理器将来发布,在模式中,选择顺序并点击运行

  • 同时进行多项试验,在模式中,选择同时并点击运行.如果当前没有并行池,experimental Manager将使用默认集群配置文件启动一个并行池。然后,实验管理器同时运行与并行池中工作人员数量相同的试验。为了获得最好的结果,在运行实验之前,启动一个具有与gpu一样多的worker的并行池。有关更多信息,请参见使用实验管理器并行训练网络而且GPU计算要求(并行计算工具箱)

  • 将实验卸载为批处理作业模式中,选择批处理顺序批处理同时,指明你的集群而且池大小,并单击运行.有关更多信息,请参见将实验作为批处理作业卸载到集群

结果表显示了每次试验的准确性和损失。

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

如果需要测试单个试验的性能,可以导出训练过的网络或该试验的训练信息。在实验管理器将来发布,选择出口>训练网络出口>培训信息,分别。有关更多信息,请参见而且信息.将结果表的内容另存为表格数组在MATLAB工作空间,选择出口>结果表

关闭实验

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

附录1:设置函数

该功能配置实验的训练数据、网络架构和训练选项。

输入

  • 参数个数是一个包含来自experimental Manager超参数表字段的结构。

输出

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

  • lgraph是定义神经网络架构的层图。

  • 选项是一个trainingOptions对象。

函数[augimdsTrain,lgraph,options] = TransferLearningExperiment_setup1(params) networkName = params. networkName;开关networkName情况下“squeezenet”网=挤压网;miniBatchSize = 128;情况下“googlenet”Net = googlenet;miniBatchSize = 128;情况下“resnet18”Net = resnet18;miniBatchSize = 128;情况下“mobilenetv2”Net = mobilenetv2;miniBatchSize = 128;情况下“resnet50”Net = resnet50;miniBatchSize = 128;情况下“resnet101”Net = resnet101;miniBatchSize = 64;情况下“inceptionv3”Net = inceptionv3;miniBatchSize = 64;情况下“inceptionresnetv2”Net = inceptionresnetv2;miniBatchSize = 64;否则错误(“未定义的网络选择。”);结束url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile(下载文件夹,“flower_dataset.tgz”);imageFolder = fullfile(下载文件夹,“flower_photos”);如果~存在(imageFolder“dir”) disp ("正在下载花卉数据集(218 MB)…") websave(文件名,url);解压(文件名,downloadFolder)结束imds = imageDatastore(imageFolder,...IncludeSubfolders = true,...LabelSource =“foldernames”);[imdsTrain,imdsValidation] = splitEachLabel(imds,0.9);inputSize = net.Layers(1).InputSize;augimdsTrain = augmentedimagedastore (inputSize,imdsTrain);augimdsValidation = augmentedImageDatastore(inputSize,imdsValidation);lgraph = layerGraph(net);[learnableLayer,classLayer] = findLayersToReplace(lgraph);numClasses = numel(categories(imdsTrain.Labels));如果isa (learnableLayer“nnet.cnn.layer.FullyConnectedLayer”) newLearnableLayer = fullyConnectedLayer(numClasses,...Name =“new_fc”...WeightLearnRateFactor = 10,...BiasLearnRateFactor = 10);elseifisa (learnableLayer“nnet.cnn.layer.Convolution2DLayer”) newLearnableLayer = convolution2dLayer(1,numClasses,...Name =“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 = floor(numObservations/miniBatchSize);validationFrequency = validationFrequencyEpochs * numIterationsPerEpoch;选项= trainingOptions(“个”...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”)错误(参数必须是LayerGraph对象结束src = string(lgraph.Connections.Source);dst = string(lgraph.Connections.Destination);layerNames = string({lgraph.Layers.Name}');isClassificationLayer = arrayfun(@(l))...(isa (l,“nnet.cnn.layer.ClassificationOutputLayer”) | isa (l,“nnet.layer.ClassificationLayer”)),...lgraph.Layers);如果sum(isClassificationLayer) ~= 1 error(“层图必须有一个单一的分类层。”结束classLayer = lgraph.Layers(isClassificationLayer);currentLayerIdx = find(isClassificationLayer);真正的如果number (currentLayerIdx) ~= 1 error(“层图必须在分类层之前有一个单一的可学习层。”结束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);结束结束

另请参阅

应用程序

功能

相关的话题