主要内容

利用度量函数评估深度学习实验

这个例子展示了如何使用度量函数来评估实验的结果。默认情况下,当你进行内置训练实验时,实验管理器计算实验中每个试验的损失、准确度(用于分类实验)和均方根误差(用于回归实验)。要计算其他度量,请创建自己的度量函数。例如,您可以将度量函数定义为:

  • 测试训练网络的预测性能。

  • 通过计算验证损失在最终epoch上的斜率来评估训练进度。

  • 显示在每个试验中使用不同网络架构的实验中使用的网络的大小。

当每个试验完成训练后,实验经理评估度量函数,并在结果表中显示它们的值。

在本例中,训练一个网络对手写数字图像进行分类。两个度量函数决定了训练过的网络识别数字1和7的图像的能力。有关使用实验管理器训练网络进行图像分类的更多信息,请参见扫描超参数图像分类

定义度量函数

在内置的训练实验中添加一个度量函数。

  1. 实验窗格中,在指标,点击添加

  2. 增加指标对话框中,输入度量函数的名称,然后单击好吧.如果输入项目中已经存在的函数的名称,实验管理器会将其添加到实验中。否则,实验管理器将创建一个由默认模板定义的函数。

  3. 选择指标函数的名称,单击编辑.在MATLAB®编辑器中打开度量函数。

度量函数的输入是一个包含三个字段的结构:

  • trainedNetworkSeriesNetwork对象或DAGNetwork对象返回的trainNetwork函数。有关更多信息,请参见

  • trainingInfo方法返回的训练信息是否包含结构trainNetwork函数。有关更多信息,请参见信息

  • 参数具有来自超参数表的字段的结构。

自定义度量函数的输出必须是标量、逻辑值或字符串。

开放实验

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

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

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

数字分类,使用度量函数评估结果:* OnesAsSevens返回误分类为7s的1的百分比。* SevensAsOnes返回误分类为1的7的百分比。

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

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

  • 负荷训练数据定义包含训练和验证数据的图像数据存储。本示例从Digits数据集中加载图像。有关此数据集的更多信息,请参见图像数据集

digitDatasetPath = fullfile(toolboxdir(“nnet”),...“nndemos”“nndatasets”“DigitDataset”);imdsTrain = imageDatastore(digitDatasetPath,...IncludeSubfolders = true,...LabelSource =“foldernames”);
numTrainingFiles = 750;[imdsTrain,imdsValidation] = splitEachLabel(imdsTrain,numTrainingFiles);
  • 定义网络架构定义用于深度学习分类的卷积神经网络的体系结构。本例使用setup函数模板提供的默认分类网络。

inputSize = [28 28 1];numClasses = 10;layers = [imageInputLayer(inputSize) convolution2dLayer(5,20) batchNormalizationLayer reluLayer fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];
  • 指定培训项目定义了一个trainingOptions实验对象。该示例加载训练选项的值InitialLearnRate而且动力从超参数表。

选项= trainingOptions(“个”...MaxEpochs = 5,...ValidationData = imdsValidation,...ValidationFrequency = 30,...InitialLearnRate =参数。InitialLearnRate,...动量=参数。动力,...Verbose = false);

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

指标节指定评估实验结果的可选函数。实验管理器每次完成网络训练后都会评估这些功能。选中指标函数的名称,单击,可以查看指标函数编辑.在MATLAB编辑器中打开度量函数。

这个例子包含两个度量函数。

  • OnesAsSevens返回数字1的图像被训练过的网络误分类为7的百分比。

  • SevensAsOnes返回被训练过的网络误分类为数字7的图像的百分比。

这些函数中的每一个都使用经过训练的网络对整个Digits数据集进行分类。然后,函数确定实际标签和预测标签不一致的图像数量。例如,函数OnesAsSevens计算实际标签为的图像数量“1”和一个预测的标签“7”.类似地,函数SevensAsOnes计算实际标签为的图像数量“7”和一个预测的标签“1”.这些度量函数的代码出现在附录2而且附录3在这个例子的最后。

运行实验

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

  • 下的“实验管理器”工具条上,每次运行一个试验模式中,选择顺序并点击运行

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

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

结果表显示了每个试验的度量函数值。

评估结果

要为你的实验找到最好的结果,请对结果表进行排序。例如,找出错误分类次数最少的试验。

  1. 指向OnesAsSevens列。

  2. 单击三角形图标。

  3. 选择升序排序

的下拉菜单,找到错误分类7最少的试验SevensAsOnes列和选择升序排序

如果没有一个试验使这两个值都最小化,那么选择一个在这两个指标上都排名很好的试验。例如,可以将结果表导出到MATLAB工作区作为表格数组并计算每个试验的两个度量值的平均值。

  1. 实验管理器将来发布,点击出口>结果表

  2. 在对话框窗口中,为导出的表输入工作区变量的名称。默认名称为resultsTable

  3. 使用导出的网络作为函数的输入averageMetrics,在附录4在这个例子的最后。例如,在MATLAB命令窗口中输入:

averageMetrics (resultsTable);

该函数显示具有最低平均度量值的试验的度量信息的摘要。

******************************************
最佳尝试:4个误分类为7的:1.3000%(排名:3)误分类为1的:1.2000%(排名:1)平均公制值:1.2500%
******************************************

要记录对实验结果的观察,请添加注释。

  1. 在结果表中,右键单击OnesAsSevens最好的审判细胞。

  2. 选择添加注释

  3. 注释窗格,在文本框中输入您的观察结果。

  4. 控件重复上述步骤SevensAsOnes细胞。

有关更多信息,请参见对实验结果进行排序、过滤和注释

关闭实验

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

附录1:设置函数

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

输入

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

输出

  • imdsTrain是用于训练数据的图像数据存储。

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

  • 选项是一个trainingOptions对象。

函数[imdsTrain,layers,options] = ClassificationExperiment_setup1(params) digitDatasetPath = fullfile(toolboxdir(“nnet”),...“nndemos”“nndatasets”“DigitDataset”);imdsTrain = imageDatastore(digitDatasetPath,...IncludeSubfolders = true,...LabelSource =“foldernames”);numTrainingFiles = 750;[imdsTrain,imdsValidation] = splitEachLabel(imdsTrain,numTrainingFiles);inputSize = [28 28 1];numClasses = 10;layers = [imageInputLayer(inputSize) convolution2dLayer(5,20) batchNormalizationLayer reluLayer fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];选项= trainingOptions(“个”...MaxEpochs = 5,...ValidationData = imdsValidation,...ValidationFrequency = 30,...InitialLearnRate =参数。InitialLearnRate,...动量=参数。动力,...Verbose = false);结束

附录2:找出被错误分类为7的

这个函数决定了被错误分类为7的1的数量。

函数metricOutput = OnesAsSevens(trialInfo) actualValue =“1”;predValue =“7”;net = trialInfo.trainedNetwork;digitDatasetPath = fullfile(toolboxdir(“nnet”),...“nndemos”“nndatasets”“DigitDataset”);imds = imageDatastore(digitDatasetPath,...IncludeSubfolders = true,...LabelSource =“foldernames”);YActual = imds.Labels;YPred =分类(net,imds);K = sum(YActual == actualValue & YPred == predValue);N = sum(YActual == actualValue);metricOutput = 100*K/N;结束

附录3:找出误分类为1的7

这个函数决定了被错误分类为1的7的个数。

函数metricOutput = SevensAsOnes(trialInfo“7”;predValue =“1”;net = trialInfo.trainedNetwork;digitDatasetPath = fullfile(toolboxdir(“nnet”),...“nndemos”“nndatasets”“DigitDataset”);imds = imageDatastore(digitDatasetPath,...IncludeSubfolders = true,...LabelSource =“foldernames”);YActual = imds.Labels;YPred =分类(net,imds);K = sum(YActual == actualValue & YPred == predValue);N = sum(YActual == actualValue);metricOutput = 100*K/N;结束

附录4:计算平均度量值

这个函数从结果表中提取度量值。然后,该函数将每个指标的平均指标值和排名附加到结果表中,并显示最佳试验的指标信息摘要。

函数results = averageMetrics(results) Metric1 = results. metrics . onesassevens;Metric2 = results.Metrics.SevensAsOnes;= (Metric1+Metric2)/2;results =[结果表(MetricAverage,Metric1,Metric2)];N = height(结果);结果= sortrows(结果,“Metric1”);OnesAsSevensRanking = (1:N)';results =[结果表(OnesAsSevensRanking)];结果= sortrows(结果,“Metric2”);SevensAsOnesRanking = (1:N)';results = [results table(SevensAsOnesRanking)];结果= sortrows(结果,“MetricAverage”);结果= removevars(结果,[“Metric1”“Metric2”]);流(“\ n ******************************************\ n \ n”);流(“最佳试用:%d\n”, results.Trial (1));流(“被错误分类为7的:%。4f%%(排名:%d)\n"...results.Metrics.OnesAsSevens (1) results.OnesAsSevensRanking (1));流(“7误归为1:%。4f%%(排名:%d)\n"...results.Metrics.SevensAsOnes (1) results.SevensAsOnesRanking (1));流("公制值的平均值:%.4f%%\n"...results.MetricAverage (1));流(“\ n ******************************************\ n \ n”);结束

另请参阅

应用程序

功能

相关的话题