主要内容

试验重量转移学习的初始值设定项

自从R2020a

这个例子展示了如何配置一个实验初始化权重的卷积和完全连接层使用不同重量的初始化培训。比较不同体重的初始化任务的性能,使用这个示例创建一个实验作为参考。

深入学习网络训练时,初始化层的重量和偏见可能会有更大的影响对网络训练。初始值设定项的选择一个更大的对网络的影响没有批标准化层。体重初始值设定项的更多信息,请参阅比较层重量的初始化

开放实验

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

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

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

执行转移学习初始化权重pretrained卷积和完全连接层的网络。

Hyperparameters节指定策略和hyperparameter值用于实验。当您运行实验,实验管理器使用每一列车网络的组合hyperparameter hyperparameter表中指定的值。下面的例子使用了hyperparametersWeightsInitializerBiasInitializer指定重量和偏见的卷积和完全连接层初始化一个pretrained网络。关于这些初始化器的更多信息,见WeightsInitializerBiasInitializer

设置函数部分指定配置训练数据的功能,网络体系结构,实验和培训选项。在MATLAB®编辑器打开这个功能,点击编辑。函数的代码也出现在设置函数。setup函数的输入是一个结构从hyperparameter表与字段。函数返回三个输出,训练一个网络用于图像分类问题。在这个例子中,设置功能:

  • 加载一个pretrained GoogLeNet网络。

lgraph = googlenet(重量=“没有”);
  • 下载和提取数据集的花朵,这是大约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 = lgraph.Layers (1) .InputSize;augimdsTrain = augmentedImageDatastore (inputSize imdsTrain);augimdsValidation = augmentedImageDatastore (inputSize imdsValidation);
  • 初始化输入重量的卷积和完全连接层通过hyperparameter表中指定的初始化。辅助函数findLayersToReplace决定了层网络体系结构,可以修改转移学习。查看这个函数的代码,看看发现层来代替

numClasses =元素个数(类别(imdsTrain.Labels));weightsInitializer = params.WeightsInitializer;biasInitializer = params.BiasInitializer;learnableLayer = findLayersToReplace (lgraph);newLearnableLayer = fullyConnectedLayer (numClasses Name =“new_fc”);lgraph = replaceLayer (lgraph learnableLayer.Name newLearnableLayer);i = 1:元素个数(lgraph.Layers)层= lgraph.Layers(我);如果类(层)= =“nnet.cnn.layer.Convolution2DLayer”| |类(层)= =“nnet.cnn.layer.FullyConnectedLayer”layerName = layer.Name;newLayer =层;newLayer。WeightsInitializer = WeightsInitializer;newLayer。BiasInitializer = BiasInitializer;lgraph = replaceLayer (lgraph layerName newLayer);结束结束
  • 定义了一个trainingOptions实验对象。10时代列车网络的例子中,使用一个mini-batch大小为128和验证网络每5时代。

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

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

运行实验

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

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

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

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

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

注意,使用他的试验重量初始化器,实验管理器中断培训,因为培训和确认损失成为定义经过一系列的迭代。继续培训这些试验不产生任何有用的结果。在结果表中,状态列显示的原因停止这些试验(培训损失是南)。

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

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

关闭实验

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

设置函数

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

函数[augimdsTrain、lgraph选项]= WeightInitializerExperiment_setup (params)

负载Pretrained网络

lgraph = googlenet(重量=“没有”);

负荷训练数据

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 = lgraph.Layers (1) .InputSize;augimdsTrain = augmentedImageDatastore (inputSize imdsTrain);augimdsValidation = augmentedImageDatastore (inputSize imdsValidation);

定义网络体系结构

numClasses =元素个数(类别(imdsTrain.Labels));weightsInitializer = params.WeightsInitializer;biasInitializer = params.BiasInitializer;learnableLayer = findLayersToReplace (lgraph);newLearnableLayer = fullyConnectedLayer (numClasses Name =“new_fc”);lgraph = replaceLayer (lgraph learnableLayer.Name newLearnableLayer);i = 1:元素个数(lgraph.Layers)层= lgraph.Layers(我);如果类(层)= =“nnet.cnn.layer.Convolution2DLayer”| |类(层)= =“nnet.cnn.layer.FullyConnectedLayer”layerName = layer.Name;newLayer =层;newLayer。WeightsInitializer = WeightsInitializer;newLayer。BiasInitializer = BiasInitializer;lgraph = replaceLayer (lgraph layerName newLayer);结束结束

指定培训选项

miniBatchSize = 128;validationFrequencyEpochs = 5;numObservations = augimdsTrain.NumObservations;numIterationsPerEpoch =地板(numObservations / miniBatchSize);validationFrequency = validationFrequencyEpochs * numIterationsPerEpoch;选择= trainingOptions (“个”,MaxEpochs = 10,MiniBatchSize = MiniBatchSize,洗牌=“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);结束结束

另请参阅

应用程序

功能

相关的话题