主要内容

学习尝试多个Pretrained网络传输

这个例子展示了如何配置一个实验取代层不同pretrained网络转移学习。在深度学习应用程序转移学习是常用的。pretrained网络,可以使用它作为一个起点,学习一个新任务。微调网络转移学习通常比训练一个网络快得多,也更容易与随机初始化权重从零开始。您可以快速学习功能转移到一个新的任务使用较少的训练图像。

有许多pretrained网络中可用的深度学习工具箱™。这些pretrained网络有不同的特点,在选择一个网络适用于你的问题。最重要的特点是网络精度,速度,和大小。选择一个网络通常是这些特征之间的权衡。比较不同pretrained网络性能的任务,编辑这个实验并指定使用哪个pretrained网络。

这个实验需要深度学习工具箱模型GoogLeNet网络金宝app支持包和深度学习工具箱模型ResNet-18网络金宝app支持包。在你运行实验之前,安装这些包通过调用的支持金宝appgooglenetresnet18函数和点击下载链接。有关其他pretrained网络的更多信息,您可以从附件下载探险家,明白了Pretrained深层神经网络

开放实验

首先,打开示例。实验管理器加载一个预配置实验的项目,你可以检查和运行。开放实验,实验的浏览器面板,双击实验的名称(TransferLearningExperiment)。

内置训练实验由一个描述,hyperparameters表,设置函数,和一组度量函数对实验的结果进行评估。有关更多信息,请参见配置内置的训练实验

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

执行转移学习代替pretrained网络层。

Hyperparameters部分指定策略(详尽的扫描)和hyperparameter值用于实验。当您运行实验,实验管理器使用每一列车网络的组合hyperparameter hyperparameter表中指定的值。在这个例子中,hyperparameterNetworkName指定网络训练和培训的价值选择miniBatchSize

设置函数配置培训数据、网络体系结构和培训选择实验。setup函数的输入是一个结构从hyperparameter表与字段。setup函数返回三个输出,训练一个网络用于图像分类问题。在这个例子中,设置功能:

  • 加载一个pretrained网络hyperparameter对应NetworkName

networkName = params.NetworkName;
开关networkName情况下“squeezenet”网= squeezenet;miniBatchSize = 128;情况下“googlenet”网= googlenet;miniBatchSize = 128;情况下“resnet18”网= resnet18;miniBatchSize = 128;情况下“mobilenetv2”网= mobilenetv2;miniBatchSize = 128;情况下“resnet50”网= resnet50;miniBatchSize = 128;情况下“resnet101”网= resnet101;miniBatchSize = 64;情况下“inceptionv3”网= inceptionv3;miniBatchSize = 64;情况下“inceptionresnetv2”网= inceptionresnetv2;miniBatchSize = 64;否则错误(“未定义的网络选择。”);结束
  • 下载和提取数据集的花朵,这是大约218 MB的。在这个数据集的更多信息,参见图像数据集

url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile (downloadFolder,“flower_dataset.tgz”);
imageFolder = fullfile (downloadFolder,“flower_photos”);如果~存在(imageFolder“dir”)disp (“下载数据集(218 MB)花……”)websave(文件名,url);解压(文件名,downloadFolder)结束
imd = imageDatastore (imageFolder,IncludeSubfolders = true,LabelSource =“foldernames”);
[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9);inputSize = net.Layers (1) .InputSize;augimdsTrain = augmentedImageDatastore (inputSize imdsTrain);augimdsValidation = augmentedImageDatastore (inputSize imdsValidation);
  • 取代pretrained网络进行传输的可学的层次的学习。辅助函数findLayersToReplace中列出附录2在这个例子中,决定了层传输的网络体系结构来代替学习。pretrained网络可用的更多信息,请参阅Pretrained深层神经网络

lgraph = layerGraph(净);[learnableLayer, classLayer] = findLayersToReplace (lgraph);numClasses =元素个数(类别(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 numClassesName =“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);

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

指标部分指定可选功能,评估实验的结果。这个例子不包括任何自定义度量函数。

运行实验

当您运行实验,实验经理列车网络设置函数定义的六倍。每个试验使用不同的组合hyperparameter值。默认情况下,实验管理器运行一个审判。如果你有并行计算工具箱™,你可以同时运行多个试验或卸载实验作为批处理作业在一个集群中。

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

  • 同时,运行多个试验模式中,选择同时并点击运行。如果没有当前并行池、实验管理器启动一个集群使用默认配置文件。实验管理器然后运行尽可能多的同时试验有工人在你平行池。为达到最佳效果,在你运行你的实验,开始与尽可能多的工人gpu并行池。有关更多信息,请参见并行使用实验管理器来训练网络GPU计算的需求(并行计算工具箱)

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

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

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

来测试一个人的性能试验,导出训练网络或审判的培训信息。在实验管理器将来发布,选择出口>训练网络出口>培训信息,分别。有关更多信息,请参见信息。保存的内容作为一个结果表数组的MATLAB工作区,选择出口>结果表

关闭实验

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

附录1:设置功能

这个函数配置培训数据、网络体系结构和培训选择实验。

输入

  • 参数个数从实验管理器是一个结构字段hyperparameter表。

输出

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

  • lgraph是一个层图,定义了神经网络架构。

  • 选项是一个trainingOptions对象。

函数[augimdsTrain、lgraph选项]= TransferLearningExperiment_setup1 (params) networkName = params.NetworkName;开关networkName情况下“squeezenet”网= squeezenet;miniBatchSize = 128;情况下“googlenet”网= googlenet;miniBatchSize = 128;情况下“resnet18”网= resnet18;miniBatchSize = 128;情况下“mobilenetv2”网= mobilenetv2;miniBatchSize = 128;情况下“resnet50”网= resnet50;miniBatchSize = 128;情况下“resnet101”网= resnet101;miniBatchSize = 64;情况下“inceptionv3”网= inceptionv3;miniBatchSize = 64;情况下“inceptionresnetv2”网= 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”);如果~存在(imageFolder“dir”)disp (“下载数据集(218 MB)花……”)websave(文件名,url);解压(文件名,downloadFolder)结束imd = imageDatastore (imageFolder,IncludeSubfolders = true,LabelSource =“foldernames”);[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 = fullyConnectedLayer (numClasses,Name =“new_fc”,WeightLearnRateFactor = 10,BiasLearnRateFactor = 10);elseifisa (learnableLayer“nnet.cnn.layer.Convolution2DLayer”)newLearnableLayer = convolution2dLayer (1 numClassesName =“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 * 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 =字符串(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);如果总和(isClassificationLayer) ~ = 1错误(“层图必须有一个单一的分类层。”)结束classLayer = lgraph.Layers (isClassificationLayer);currentLayerIdx =找到(isClassificationLayer);真正的如果元素个数(currentLayerIdx) ~ = 1错误(“层图必须有一个可学的一层一层分类前。”)结束currentLayerType =类(lgraph.Layers (currentLayerIdx));isLearnableLayer = ismember (currentLayerType,(“nnet.cnn.layer.FullyConnectedLayer”,“nnet.cnn.layer.Convolution2DLayer”]);如果isLearnableLayer learnableLayer = lgraph.Layers (currentLayerIdx);返回结束currentDstIdx =找到(layerNames (currentLayerIdx) = = dst);currentLayerIdx =找到(src (currentDstIdx) = = layerNames);结束结束

另请参阅

应用程序

功能

相关的话题