主要内容

利用贝叶斯优化调优实验超参数

这个例子展示了如何使用贝叶斯优化实验管理器找出卷积神经网络的最优网络超参数和训练选项。贝叶斯优化提供了一种在实验中清除超参数的备选策略。您可以为每个超参数指定一个值范围,并选择一个要优化的指标,实验管理器将搜索优化所选指标的超参数组合。贝叶斯优化需要统计和机器学习工具箱™。

在本例中,训练一个网络对CIFAR-10数据集中的图像进行分类。该实验使用贝叶斯优化来寻找最小化自定义度量函数的超参数组合。超参数包括训练算法的选项,以及网络架构本身的参数。自定义度量函数确定随机选择的测试集上的分类误差。有关在实验管理器中定义自定义指标的更多信息,请参见利用度量函数评估深度学习实验

方法以编程方式查找最优超参数值bayesopt函数。有关更多信息,请参见使用贝叶斯优化的深度学习

开放实验

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

内置的训练实验由描述、超参数表、设置函数和用于评估实验结果的度量函数集合组成。使用贝叶斯优化的实验包括额外的选项来限制实验的持续时间。有关更多信息,请参见配置内置训练实验

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

寻找卷积神经网络的最优超参数和训练选项。超参数决定了网络截面深度、初始学习率、随机梯度下降动量和L2正则化强度。

Hyperparameters部分指定策略(贝叶斯优化)和超参数选项用于实验。对于每个超参数,指定以下选项:

  • 范围—输入两元向量,给出实值或整值超参数的上界和下界,或者输入字符串数组或单元格数组,列出类别超参数的可能值。

  • 类型——选择真正的(实值hyperparameter),整数(整值超参数),或分类(分类hyperparameter)。

  • 变换——选择没有一个(没有变换)或日志(对数变换)。为日志时,超参数必须为真正的整数和积极的。使用此选项,将在对数刻度上搜索超参数并对其建模。

当您运行实验时,实验管理器会搜索超参数的最佳组合。实验中的每次试验都使用基于先前试验结果的超参数值的新组合。下面的例子使用了这些超参数:

  • SectionDepth—用于控制网络的深度。网络的总层数为9 * SectionDepth + 7.在实验设置函数中,每层卷积滤波器的数量成正比1 /√(SectionDepth),因此对于不同的剖面深度,每次迭代的参数数量和所需的计算量大致相同。

  • InitialLearnRate-如果学习率太低,那么训练就需要很长时间。如果学习率太高,那么训练可能会达到次优结果或发散。最佳学习率取决于您的数据以及您正在训练的网络。

  • 动力-随机梯度下降动量通过使当前更新包含与前一次迭代中的更新成比例的贡献,为参数更新添加惯性。惯性效应导致更平滑的参数更新和减少随机梯度下降固有的噪声。

  • L2Regularization-使用L2正则化来防止过拟合。搜索正则化强度的空间,找到一个好的值。数据增强和批处理规范化也有助于网络的规范化。

贝叶斯优化选项,您可以通过输入最大时间(以秒为单位)和要运行的最大试验次数来指定实验的持续时间。为了最好地利用贝叶斯优化的力量,至少要执行30个目标函数评估。

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

  • 负荷训练数据从CIFAR-10数据集中下载和提取图像和标签。数据集大约是175 MB。根据您的互联网连接,下载过程可能需要一些时间。对于训练数据,本例创建了一个augmentedImageDatastore通过应用随机平移和水平反射。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。为了启用网络验证,该示例使用了5000张图像,没有进行任何扩展。有关此数据集的更多信息,请参见图像数据集

Datadir = tempdir;downloadCIFARData (datadir);
[XTrain,YTrain,XTest,YTest] = loadCIFARData(datadir);idx = randperm(数字(YTest),5000);XValidation = XTest(:,:,:,idx);YValidation = YTest(idx);
imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter(...RandXReflection = true,...RandXTranslation = pixelRange,...RandYTranslation = pixelRange);augimdsTrain = augmentedimagedastore (imageSize,XTrain,YTrain,...DataAugmentation = imageAugmenter);
  • 定义网络架构定义用于深度学习分类的卷积神经网络的体系结构。在本例中,要训练的网络有三个由helper函数生成的块convBlock,在附录2在这个例子的最后。每个块包含SectionDepth相同的卷积层。每个卷积层后面是一个批处理归一层和一个ReLU层。卷积层添加了填充,以便其空间输出大小始终与输入大小相同。在块之间,最大池化层降低空间维度的一个因素。为了确保每个卷积层所需的计算量大致相同,从一个部分到下一个部分,过滤器的数量增加了两倍。每个卷积层中的过滤器数量正比于1 /√(SectionDepth),因此不同深度的网络具有大致相同的参数数量,每次迭代所需的计算量也大致相同。

numClasses = numel(唯一的(YTrain));numF = round(16/sqrt(params.SectionDepth));layers = [imageInputLayer(imageSize) convBlock(3,numF,params.SectionDepth) maxPooling2dLayer(3,Stride=2,Padding=“相同”) convBlock(3,2*numF,params.SectionDepth) maxPooling2dLayer(3,Stride=2,Padding=“相同”) convBlock(3,4*numF,param . sectiondepth) averagePooling2dLayer(8) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];
  • 指定培训项目定义了一个trainingOptions对象使用训练选项的值进行实验“InitialLearnRate”“动量”,“L2Regularization”由贝叶斯优化算法生成。该示例用固定数量的epoch训练网络,每个epoch验证一次,并在最后一个epoch期间将学习率降低10倍,以减少参数更新的噪声,并允许网络参数稳定下来,接近损失函数的最小值。

miniBatchSize = 256;validationFrequency = floor(编号(YTrain)/miniBatchSize);选项= trainingOptions(“个”...InitialLearnRate =参数。InitialLearnRate,...动量=参数。动力,...MaxEpochs = 60,...LearnRateSchedule =“分段”...LearnRateDropPeriod = 40,...LearnRateDropFactor = 0.1,...MiniBatchSize = MiniBatchSize,...L2Regularization =参数。L2Regularization,...洗牌=“every-epoch”...Verbose = false,...ValidationData = {XValidation, YValidation},...ValidationFrequency = ValidationFrequency);

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

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

这个例子包含了自定义度量函数ErrorRate.该函数随机选择5000张测试图像和标签,在这些图像上评估训练过的网络,并计算网络误分类的图像比例。此函数的代码出现在附录3在这个例子的最后。

优化而且方向字段表示贝叶斯优化算法作为目标函数使用的度量。对于这个实验,实验经理试图最小化的值ErrorRate指标。

运行实验

当您运行实验时,实验管理器会搜索与所选指标相关的超参数的最佳组合。实验中的每次试验都使用基于先前试验结果的超参数值的新组合。默认情况下,实验管理器每次运行一个试验。如果您有并行计算工具箱™,您可以同时运行多个试验。为了获得最好的结果,在运行实验之前,启动一个具有与gpu一样多的worker的并行池。有关更多信息,请参见使用实验管理器并行训练网络而且GPU支金宝app持版本(并行计算工具箱)

  • 若要一次运行一个试验,请在“实验管理器”工具条上单击运行

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

结果表显示了每个试验的度量函数值。实验管理器为所选指标指示具有最佳值的试验。例如,在这个实验中,第三次试验产生的错误率最小。

为了确定优化所选指标的试验,实验管理器使用最佳点准则“min-observed”.有关更多信息,请参见贝叶斯优化算法(统计和机器学习工具箱)而且bestPoint(统计和机器学习工具箱)

评估结果

要在实验中测试最佳试验,首先在结果表中选择错误率最低的行。

要显示所选试验的混淆矩阵,请单击混淆矩阵

要执行额外的计算,请将训练好的网络导出到工作区。

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

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

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

testSummary (trainedNetwork)

这个函数以几种方式计算网络:

  • 它预测整个测试集的标签并计算测试误差。因为实验管理器可以在不将网络暴露给整个测试集的情况下确定最佳网络,所以测试误差可能高于自定义度量的值ErrorRate

  • 它计算标准误差(testErrorSE)和约95%置信区间(testError95CI)的泛化错误率,将测试集中每张图像的分类视为具有一定成功概率的独立事件。使用这个假设,错误分类的图像数量遵循二项分布。这种方法通常称为瓦尔德方法

  • 它显示了一些测试图像以及它们的预测类别和这些类别的概率。

该函数在MATLAB命令窗口中显示这些统计信息的摘要。

******************************************
试验错误率:0.1776标准误差:0.0038 95%置信区间:[0.1701,0.1851]
******************************************

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

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

  2. 选择添加注释

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

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

关闭实验

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

附录1:设置函数

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

输入

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

输出

  • augimdsTrain是用于训练数据的增强图像数据存储。

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

  • 选项是一个trainingOptions对象。

函数[augimdsTrain,layers,options] = BayesOptExperiment_setup1(params) datadir = tempdir;downloadCIFARData (datadir);[XTrain,YTrain,XTest,YTest] = loadCIFARData(datadir);idx = randperm(数字(YTest),5000);XValidation = XTest(:,:,:,idx);YValidation = YTest(idx);imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter(...RandXReflection = true,...RandXTranslation = pixelRange,...RandYTranslation = pixelRange);augimdsTrain = augmentedimagedastore (imageSize,XTrain,YTrain,...DataAugmentation = imageAugmenter);numClasses = numel(唯一的(YTrain));numF = round(16/sqrt(params.SectionDepth));layers = [imageInputLayer(imageSize) convBlock(3,numF,params.SectionDepth) maxPooling2dLayer(3,Stride=2,Padding=“相同”) convBlock(3,2*numF,params.SectionDepth) maxPooling2dLayer(3,Stride=2,Padding=“相同”) convBlock(3,4*numF,param . sectiondepth) averagePooling2dLayer(8) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];miniBatchSize = 256;validationFrequency = floor(编号(YTrain)/miniBatchSize);选项= trainingOptions(“个”...InitialLearnRate =参数。InitialLearnRate,...动量=参数。动力,...MaxEpochs = 60,...LearnRateSchedule =“分段”...LearnRateDropPeriod = 40,...LearnRateDropFactor = 0.1,...MiniBatchSize = MiniBatchSize,...L2Regularization =参数。L2Regularization,...洗牌=“every-epoch”...Verbose = false,...ValidationData = {XValidation, YValidation},...ValidationFrequency = ValidationFrequency);结束

附录2:创建卷积层块

的块numConvLayers卷积层,每个层都有一个指定的filterSize而且numFilters过滤器,每个过滤器后面跟着一个批处理规范化层和一个ReLU层。

函数layers = convBlock(filterSize,numFilters,numConvLayers) layers =[卷积2dlayer (filterSize,numFilters,Padding= .“相同”) batchNormalizationLayer reluLayer;layers = repmat(layers,numConvLayers,1);结束

附录3:计算错误率

该度量函数将包含字段的结构作为输入trainedNetworktrainingInfo,参数

  • trainedNetworkSeriesNetwork对象或DAGNetwork对象返回的trainNetwork函数。

  • trainingInfo方法返回的训练信息是否包含结构trainNetwork函数。

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

该函数选择5000个测试图像和标签,在测试集上评估训练好的网络,计算预测的图像标签,并计算测试数据上的错误率。

函数metricOutput = error (trialInfo) datadir = tempdir;[~,~,XTest,YTest] = loadCIFARData(datadir);idx = randperm(数字(YTest),5000);XTest = XTest(:,:,:,idx);YTest = YTest(idx);ypredict = category (trialInfo.trainedNetwork,XTest);metricOutput = 1 - mean(ypredict == YTest);结束

附录4:总结测试统计数据

该函数计算测试误差、标准误差和大约95%的置信区间,并在MATLAB命令窗口中显示这些统计信息的摘要。该函数还包括一些测试图像及其预测类和这些类的概率。

函数testSummary(net) datadir = tempdir;[~,~,XTest,YTest] = loadCIFARData(datadir);[ypredict,probs] = category (net,XTest);testError = 1 - mean(ypredict == YTest);NTest =数值(YTest);testError =√(testError*(1-testError)/NTest);testError95CI = [testError - 1.96*testErrorSE, testError + 1.96*testErrorSE];流(' \ n ******************************************\ n \ n’);流('测试错误率:%.4f\n', testError);流('标准错误:%.4f\n', testErrorSE);流('95%%置信区间:[%。4 f % .4f] \ n 'testError95CI (1) testError95CI (2));流(' \ n ******************************************\ n \ n’);图idx = randperm(数字(YTest),9);i = 1:元素个数(idx)次要情节(3 3 i) imshow (XTest (:,:,:, idx(我)));Prob = num2str(100*max(probs(idx(i),:)),3);predClass = char(ypredict (idx(i)));label = [predClass,”、“概率,“%”];标题(标签)结束结束

另请参阅

应用程序

功能

相关的话题