主要内容

重量初始化器进行转移学习的实验

此示例显示如何配置使用不同权重初始化器初始化卷积和完全连接的层的权重的实验。要对您的任务进行比较不同重量初始化器的性能,请使用此示例作为指南创建实验。

当训练一个深度学习网络时,初始化的层权值和偏差会对网络训练的好坏有很大的影响。初始化器的选择对没有批处理规格化层的网络有较大的影响。有关权重初始化器的更多信息,请参见比较层重量初始化器

开放实验

首先,打开示例。实验经理使用您可以检查和运行的预先配置实验加载项目。打开实验,在实验的浏览器窗格,双击实验的名称(屈服rializerexperiment.)。

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

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

通过初始化普定网络中的卷积和完全连接的层的权重来执行转移学习。

Hyperparameters部分指定策略(详尽的扫描用于实验的)和Quand参数值。运行实验时,实验经理使用HyperParameter表中指定的HyperParameter值的每个组合来列车。此示例使用HyperParameters掌控剂偏见的偏大机指定卷积网络中的卷积和完全连接的图层的权重和偏置初始化器。有关这些初始化器的更多信息,请参阅掌控剂偏见的偏大机

设置函数配置实验的培训数据,网络架构和培训选项。设置函数的输入是具有来自HyperParameter表的字段的结构。安装程序返回用于培训网络以进行图像分类问题的三个输出。在此示例中,设置功能:

  • 加载预制的Googlenet网络。

Lgraph = googlenet(权重=“没有任何”);
  • 下载并提取花数据集,约为218 MB。有关此数据集的更多信息,请参阅图像数据集

url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadfolder = tempdir;filename = fullfile(downloadFolder,“flower_dataset.tgz”);
imagefolder = fullfile(DownloadFolder,“花_照片”);如果~存在(imageFolder“dir”)disp(“下载花数据集(218 MB)......”)WebSave(Filename,URL);Untar(文件名,DownloadFolder)结尾
imds = imageageataStore(imageFolder,...upplyubfolders = true,...LabelSource =“foldernames”);
[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9);InputSize = Net.Layers(1).InputSize;augimdsTrain = augmentedImageDatastore (inputSize imdsTrain);augimdsvalidation = augmentedimagedataStore(Inputsize,IMDSValidation);
  • 使用HyperParameter表中指定的初始化器初始化卷积和完全连接的图层中的输入权重。辅助功能findlayerstoreplace,列入附录2在此示例结束时,确定可以修改用于传输学习的网络架构中的图层。

numClasses =元素个数(类别(imdsTrain.Labels));weightsInitializer = params.WeightsInitializer;Biasinitializer = paramsinitializer;
learnableLayer = findLayersToReplace (lgraph);newLearnableLayer = fullyConnectedLayer (numClasses Name =“new_fc”);lgraph = replaceLayer (lgraph learnableLayer.Name newLearnableLayer);
为了i = 1:numel(lapraph.layers)图层= lgraph.Layers(i);
如果类(图层)==“nnet.cnn.layer.convolution2dlayer”||...类(图层)==“nnet.cnn.layer.FullConnectedLayer”layername = tillay.name;newlayer =图层;
newlayer.weightsinitializer = verialsinitializer;newlayer.biasinitializer =偏见;
lgraph = replaceLayer (lgraph layerName newLayer);结束
  • 定义A.培训选项实验的对象。该示例用Mini-Batch大小为128列举了10个时期的网络,并每5个时期验证网络。

minibatchsize = 128;ValidationFrequencyPochs = 5;
numobservations = augimdstrain.numobservations;numiterationsperepoch =楼层(numobservations / minibatchsize);ValidationFrequency = ValidationFrequencyPochs * NumitrationsPerePoch;
选项=培训选项(“SGDM”...maxepochs = 10,...minibatchsize =小匹匹匹匹匹匹匹配,...洗牌=“每一代”...validationdata = augimdsvalidation,...ValidationFrequency =验证职务,...verbose = false);

检查设置功能,在设置函数, 点击编辑.设置函数在MATLAB®编辑器中打开。此外,设置函数的代码显示在附录1在这个例子结束时。

指标部分指定评估实验结果的可选功能。此示例不包括任何自定义度量标准功能。

运行实验

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

  • 在实验管理器工具系列上运行一个实验试验,请单击运行

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

结果表显示了每次试验的准确性和损失。实验运行时,单击培训策划显示培训情节并跟踪每次试验的进度。点击混乱矩阵在每个完成的试验中显示验证数据的混淆矩阵。

注意,对于使用He权重初始化器的试验,Experiment Manager会中断训练,因为训练和验证损失在几次迭代后变得不确定。继续这些试验的训练不会产生任何有用的结果。

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

要测试单个试验的性能,导出培训的网络或审判的培训信息。在这方面实验经理将来发布,选择出口>训练网络或者出口>培训信息, 分别。有关更多信息,请参见信息

关闭实验

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

附录1:设置功能

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

输入

  • 参数是来自实验经理HyperParameter表的字段的结构。

输出

  • Augimdstrain.是一个用于训练数据的增强图像数据存储对象。

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

  • 选项是A.培训选项目的。

功能[Augimdstrain,LPraph,选项] = weyceinitializerexperiment_setup1(params)lgraph = googlenet(权重=“没有任何”);url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadfolder = tempdir;filename = fullfile(downloadFolder,“flower_dataset.tgz”);imagefolder = fullfile(DownloadFolder,“花_照片”);如果~存在(imageFolder“dir”)disp(“下载花数据集(218 MB)......”)WebSave(Filename,URL);Untar(文件名,DownloadFolder)结尾imds = imageageataStore(imageFolder,...upplyubfolders = 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:numel(lapraph.layers)图层= lgraph.Layers(i);如果类(层)==“nnet.cnn.layer.convolution2dlayer”||...类(层)==“nnet.cnn.layer.fulleconnectedLayer”layerName = layer.Name;newLayer =层;newlayer.weightsinitializer = verialsinitializer;newlayer.biasinitializer =偏见;lgraph = replaceLayer (lgraph layerName newLayer);结尾结尾minibatchsize = 128;ValidationFrequencyPochs = 5;numobservations = augimdstrain.numobservations;numiterationsperepoch =楼层(numobservations / minibatchsize);ValidationFrequency = ValidationFrequencyPochs * NumitrationsPerePoch;选项=培训选项(“SGDM”...maxepochs = 10,...minibatchsize =小匹匹匹匹匹匹匹配,...洗牌=“每一代”...validationdata = augimdsvalidation,...ValidationFrequency =验证职务,...verbose = false);结尾

附录2:查找替换的图层

此功能找到单个分类层和图层图的前面的学习(完全连接或卷积)层lgraph

功能[LearnableLayer,ClassLayer] = findlayerstoreplace(Lapraph)如果〜Isa(Lgraph,“nnet.cnn.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(isclassificallayer)〜= 1错误(“层图必须有一个分类层。”结尾classlayer = lgraph.Layers(Isclassificallayer);currentlayeridx = find(iscrassificationlayer);尽管真的如果numel(currentLayerIdx) ~= 1错误(“图层图必须具有在分类层之前的单个学习层。”结尾currentLayerType =类(lgraph.Layers (currentLayerIdx));isLearnableLayer = ismember (currentLayerType,...“nnet.cnn.layer.fulleconnectedLayer”“nnet.cnn.layer.convolution2dlayer”]);如果iSlearnableLayer EnsearableLayer = Lapraph.Layers(CurrentLayerIdx);返回结尾currentDstIdx = find(layerNames(currentLayerIdx) == dst);currentLayerIdx = find(src(currentDstIdx) == layerNames);结尾结尾

另请参阅

应用程序

功能

相关话题