这个例子展示了如何配置一个实验取代层不同pretrained网络转移学习。在深度学习应用程序转移学习是常用的。pretrained网络,可以使用它作为一个起点,学习一个新任务。微调网络转移学习通常比训练一个网络快得多,也更容易与随机初始化权重从零开始。您可以快速学习功能转移到一个新的任务使用较少的训练图像。
有许多pretrained网络中可用的深度学习工具箱™。这些pretrained网络有不同的特点,在选择一个网络适用于你的问题。最重要的特点是网络精度,速度,和大小。选择一个网络通常是这些特征之间的权衡。比较不同pretrained网络性能的任务,编辑这个实验并指定使用哪个pretrained网络。
这个实验需要深度学习工具箱模型GoogLeNet网络金宝app支持包和深度学习工具箱模型ResNet-18网络金宝app支持包。在你运行实验之前,安装这些包通过调用的支持金宝appgooglenet
和resnet18
函数和点击下载链接。有关其他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 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
实验对象。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的金宝app支持版本(并行计算工具箱)。
运行一个审判的一次实验,在实验管理器将来发布,点击运行。
同时运行多个试验,点击使用并行然后运行。如果没有当前并行池、实验管理器启动一个集群使用默认配置文件。实验管理器然后执行多个同时试验,根据并行工人的数量。
一个表的结果显示每个试验的准确性和损失。在实验时,点击培训策划显示培训策划和跟踪每个试验的进展。点击混淆矩阵验证数据的混淆矩阵显示在每个试验完成。
当实验结束时,您可以对结果进行排序表的列,通过使用过滤试验过滤器通过添加注释窗格中,或记录观察结果。有关更多信息,请参见排序、过滤和注释的实验结果。
来测试一个人的性能试验,导出训练网络或审判的培训信息。在实验管理器将来发布,选择出口>训练网络或出口>培训信息,分别。有关更多信息,请参见净和信息。
在实验的浏览器窗格中,右键单击项目并选择的名称关闭项目。实验管理器关闭所有的实验和结果包含在项目中。
这个函数配置培训数据、网络体系结构和培训选择实验。
输入
参数个数
从实验管理器是一个结构字段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 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 =地板(numObservations / miniBatchSize);validationFrequency = validationFrequencyEpochs * numIterationsPerEpoch;选择= trainingOptions (“个”,…MaxEpochs = 10,…MiniBatchSize = MiniBatchSize,…InitialLearnRate = 3的军医,…洗牌=“every-epoch”,…ValidationData = augimdsValidation,…ValidationFrequency = ValidationFrequency,…Verbose = false);结束
这个函数发现单一分类层和前可学的(完全连接或卷积)层的层图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);结束结束