主要内容

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

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

在此示例中,您将培训网络以将图像从CIFAR-10数据集分类。实验使用贝叶斯优化来查找最小化自定义度量功能的超参数的组合。HyperParameters包括培训算法的选项,以及网络架构本身的参数。自定义度量标准功能确定随机选择的测试集上的分类错误。有关在实验管理器中定义自定义指标的详细信息,请参阅利用度量函数评价深度学习实验

或者,您可以通过调用的方式以编程方式找到最佳的超级参数值bayesopt函数。有关更多信息,请参见深入学习使用贝叶斯优化

开放实验

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

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

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

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

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

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

  • 类型- 选择真实的(实值hyperparameter),整数(整数值hyperparameter),或明确的(分类hyperparameter)。

  • 转变- 选择没有一个(没有变换)日志(对数变换)。为了日志,超参数必须为真实的或者整数而且是积极的。使用此选项,超参数将按对数比例进行搜索和建模。

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

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

  • initiallearnrate.—学习率过低,培训时间长。如果学习率过高,则训练可能会达到次优结果或发散。最佳学习率取决于你的数据以及你所训练的网络。

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

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

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

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

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

datadir = tempdir;downloadcardata(datadir);
[XTrain、YTrain XTest,欧美]= loadCIFARData (datadir);idx = randperm(元素个数(欧美),5000);XValidation = XTest (:,:,:, idx);yvalidation = ytest(Idx);
imageSize = [32 32 3];pixelRange = [-4 4];imageaugmenter = imagedataAugmenter(...RandXReflection = true,...randxtranslation = pixelrange,...randytranslation = pixelrange);Augimdstrain = AugmentedimageGetaTore(图像化,XTrain,Ytrain,...DataAugmentation = imageAugmenter);
  • 定义网络体系结构定义用于深度学习分类的卷积神经网络的体系结构。在本例中,要训练的网络由辅助函数生成三个块convBlock,列于附录2在这个例子的最后。每个块包含切段相同的卷积层。每个卷积层后面都有一个批处理规范化层和一个ReLU层。卷积层添加了填充,以便其空间输出大小始终与输入大小相同。在块之间,最大池层将空间维度的采样率降低两倍。以确保amo每个卷积层所需的计算量大致相同,从一个部分到下一个部分的滤波器数量增加了两倍。每个卷积层中的滤波器数量与1 /√(SectionDepth),因此不同深度的网络具有大致相同数量的参数,每次迭代所需的计算量也大致相同。

numClasses =元素个数(独特(YTrain));numF =轮(16 /√(params.SectionDepth));[imageInputLayer(imageSize) convBlock(3,numF,params.SectionDepth) maxPooling2dLayer(3,Stride=2,Padding=“相同”) convBlock (3 2 * numF params.SectionDepth) maxPooling2dLayer(3步= 2填充=“相同”) convBlock(3,4*numF,param . sectiondepth) averageepooling2dlayer (8) fullconnectedlayer (numClasses) softmaxLayer classificationLayer];
  • 指定培训选项定义一个培训选项目的为实验使用值为训练选项“InitialLearnRate”“动量”, 和“L2Regularization”由贝叶斯优化算法生成。该示例对网络进行固定次数的历元训练,每个历元验证一次,并在最后一个历元期间将学习率降低10倍,以减少参数更新的噪声,并使网络参数稳定在接近损失函数最小值的位置。

minibatchsize = 256;验证频率=地板(Numel(YTrain)/小型匹配);选项=培训选项(“sgdm”...initiallearnrate = params.initiallearnrate,...动量=参数。动力,...MaxEpochs = 60,...学习rateschedule =“分段”...LearnRateDropPeriod = 40,...LearnRateDropFactor=0.1,...MiniBatchSize = MiniBatchSize,...L2Regularization =参数。L2Regularization,...洗牌=“每个时代”...verbose = false,...ValidationData = {XValidation, YValidation},...ValidationFrequency = ValidationFrequency);

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

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

这个例子包括自定义度量函数艰难。此函数随机选择5000个测试图像和标签,对这些图像上经过训练的网络进行评估,并计算网络误分类的图像比例。此函数的代码显示在中附录3在这个例子的最后。

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

运行实验

运行实验时,实验经理在选择的公制方面搜索最佳的超参数。本实验中的每个试验都使用基于前一个试验结果的超参数值的新组合。默认情况下,实验管理器一次运行一项试验。如果您有并行计算工具箱™,则可以同时运行多个试验。为了获得最佳结果,在运行实验之前,请启动一个并行池,与GPU一样多的工人。有关更多信息,请参见使用实验经理并行培训网络GPU版金宝app本支持(并行计算工具箱)

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

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

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

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

评估结果

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

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

要执行其他计算,请将培训的网络导出到工作区。

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

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

  3. 使用导出的网络作为辅助函数的输入测试摘要,列于附录4在这个例子的最后。例如,在MATLAB命令窗口中,输入:

testSummary (trainedNetwork)

此函数以多种方式评估网络:

  • 它预测整个测试集的标签并计算测试错误。因为实验管理器在不向整个测试集公开网络的情况下确定最佳网络,所以测试错误可能高于自定义度量值艰难

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

  • 它与其预测的类和这些类的概率一起显示一些测试图像。

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

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

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

  1. 在结果表中,右键单击艰难最好的审判单元。

  2. 选择添加注释

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

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

关闭实验

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

附录1:设置功能

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

输入

  • 参数个数是一个包含来自实验管理器超参数表字段的结构。

输出

  • Augimdstrain.是训练数据的增强图像数据存储。

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

  • 选择权是一个培训选项目的。

功能[Augimdstrain,Players,Options] = Bayesoptexperiment_Setup1(Params)Datadir = Tempdir;downloadcardata(datadir);[XTrain、YTrain XTest,欧美]= loadCIFARData (datadir);idx = randperm(元素个数(欧美),5000);XValidation = XTest (:,:,:, idx);yvalidation = ytest(Idx);imageSize = [32 32 3];pixelRange = [-4 4];imageaugmenter = imagedataAugmenter(...RandXReflection = true,...randxtranslation = pixelrange,...randytranslation = pixelrange);Augimdstrain = AugmentedimageGetaTore(图像化,XTrain,Ytrain,...DataAugmentation = imageAugmenter);numClasses =元素个数(独特(YTrain));numF =轮(16 /√(params.SectionDepth));[imageInputLayer(imageSize) convBlock(3,numF,params.SectionDepth) maxPooling2dLayer(3,Stride=2,Padding=“相同”) convBlock (3 2 * numF params.SectionDepth) maxPooling2dLayer(3步= 2填充=“相同”)convBlock(3,4*numF,参数SectionDepth)平均池2层(8)完全连接层(numClasses)softmaxLayer classificationLayer];miniBatchSize=256;验证频率=楼层(numel(YTrain)/最小批量大小);选项=培训选项(“sgdm”...initiallearnrate = params.initiallearnrate,...动量=参数。动力,...MaxEpochs = 60,...学习rateschedule =“分段”...LearnRateDropPeriod = 40,...LearnRateDropFactor=0.1,...MiniBatchSize = MiniBatchSize,...L2Regularization =参数。L2Regularization,...洗牌=“每个时代”...verbose = false,...ValidationData = {XValidation, YValidation},...ValidationFrequency = ValidationFrequency);结束

附录2:创建卷积层块

这个函数创建一个块numConvLayers卷积层,每个层具有指定的filterSizenumFilters过滤器,然后是批处理规格化层和ReLU层。

功能layers=convBlock(filterSize、numFilters、numConvLayers)layers=[convolution2dLayer(filterSize、numFilters、Padding=“相同”) batchNormalizationLayer reluLayer];层= repmat(层numConvLayers 1);结束

附录3:计算错误率

这个度量函数接受一个包含字段的结构作为输入trainedNetworktrainingInfo, 和参数

  • trainedNetwork是个SeriesNetwork对象或者Dagnetwork.对象返回的trainNetwork函数。

  • trainingInfo是一个包含由trainNetwork函数。

  • 参数是包含超参数表字段的结构。

该函数选取5000张测试图像和标签,对测试集中训练的网络进行评估,计算出预测的图像标签,并计算出测试数据的错误率。

功能metricOutput=ErrorRate(trialInfo)datadir=tempdir;[~,~,XTest,YTest]=LoadCivarData(datadir);idx=randperm(numel(YTest),5000);XTest=XTest(:,:,:,idx);YTest=YTest(idx);YPredicted=classify(trialInfo.trainedNetwork,XTest);metricOutput=1-平均值(YPredicted==YTest);结束

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

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

功能testsummary(net)datadir = tempdir;[〜,〜,xtest,ytest] = loadcifardata(Datadir);[ypreedicticed,probs] =分类(net,xtest);testerror = 1  - 平均值(ypredicted == ytest);ntest = numel(ytest);testerrorse = sqrt(testerror *(1-testerror)/ ntest);testerror95ci = [testerror  -  1.96 * testerrorse,testerror + 1.96 * testerrorse];流(' \ n ******************************************\ n \ n’);流('测试错误率:%.4f\n',testerror);流(“标准错误:% .4f \ n”,测试箭头);fprintf('95%%置信区间:[%.4f,%.4f]\n',testerror95ci(1),testerror95ci(2));流(' \ n ******************************************\ n \ n’);图idx = randperm(numel(YTest),9);i = 1:numel(idx)子图(3,3,i)imshow(xtest(:,:,:,iDx(i))));prob = num2str(100 * max(probs(idx(i),:)),3);predclass = char(ypreedicted(idx(i)));标签= [predcrass,', ',prob,“%”];标题(标签)结束结束

另请参阅

应用程序

功能

相关话题