主要内容

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

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

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

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

开放实验

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

datadir = tempdir;downloadCIFARData (datadir);
[XTrain、YTrain XTest,欧美]= loadCIFARData (datadir);idx = randperm(元素个数(欧美),5000);XValidation = XTest (:,:,:, idx);YValidation =欧美(idx);
imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter (...RandXReflection = true,...RandXTranslation = pixelRange,...RandYTranslation = pixelRange);augimdsTrain = augmentedImageDatastore(图象尺寸、XTrain YTrain,...DataAugmentation = imageAugmenter);
  • 定义网络体系结构定义用于深度学习分类的卷积神经网络的体系结构。在这个例子中,要训练的网络有三个由helper函数产生的块convBlock,列于附录2在这个例子的最后。每个块包含SectionDepth相同的卷积层。每个卷积层之后是批处理规范化层和ReLU层。卷积层添加了填充,以便它们的空间输出大小始终与输入大小相同。在块之间,最大池化层向下采样空间维度的因子2。为了确保每个卷积层所需的计算量大致相同,从一个部分到下一个部分,滤波器的数量增加了两倍。每个卷积层中滤波器的数量与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];
  • 指定培训选项定义了一个trainingOptions目的为实验使用值为训练选项“InitialLearnRate”“动量”,“L2Regularization”由贝叶斯优化算法生成。列车网络的例子为固定数量的时代,每个时代验证一次,降低10倍的学习速率在过去的时代,以减少噪声的参数更新和允许网络参数安定下来接近最小的损失函数。

miniBatchSize = 256;validationFrequency =地板(元素个数(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指标。

运行实验

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

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

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

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

为了确定优化所选指标的试验,实验经理使用最佳点标准“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:设置功能

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

输入

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

输出

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

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

  • 选项是一个trainingOptions对象。

函数[augimdsTrain,layers,options] = BayesOptExperiment_setup1(params) datadir = tempdir;downloadCIFARData (datadir);[XTrain、YTrain XTest,欧美]= loadCIFARData (datadir);idx = randperm(元素个数(欧美),5000);XValidation = XTest (:,:,:, idx);YValidation =欧美(idx);imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter (...RandXReflection = true,...RandXTranslation = pixelRange,...RandYTranslation = pixelRange);augimdsTrain = augmentedImageDatastore(图象尺寸、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,param . sectiondepth) averageepooling2dlayer (8) fullconnectedlayer (numClasses) softmaxLayer classificationLayer];miniBatchSize = 256;validationFrequency =地板(元素个数(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卷积层,每个具有指定的filterSizenumFilters过滤器,然后是批处理规格化层和ReLU层。

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

附录3:计算错误率

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

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

  • trainingInfo结构是否包含由trainNetwork函数。

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

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

函数metricOutput = ErrorRate(trialInfo) datadir = tempdir;[~, ~, XTest,欧美]= loadCIFARData (datadir);idx = randperm(元素个数(欧美),5000);XTest = XTest (:,:,:, idx);欧美=欧美(idx);YPredicted =分类(trialInfo.trainedNetwork XTest);metricOutput = 1 - mean(YPredicted == YTest);结束

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

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

函数testSummary(net) datadir = tempdir;[~, ~, XTest,欧美]= loadCIFARData (datadir);(YPredicted,聚合氯化铝)=(净,XTest)进行分类;testror = 1 - mean(YPredicted == YTest);元=元素个数(欧美);testErrorSE =√testError * (1-testError) / nt);testror95ci = [testror - 1.96* testrorse, testror + 1.96* testrorse];流(' \ n ******************************************\ n \ n’);流('测试错误率:%.4f\n', testError);流(“标准错误:% .4f \ n”, testErrorSE);流(95%置信区间:[%。4 f % .4f] \ n 'testError95CI (1) testError95CI (2));流(' \ n ******************************************\ n \ n’);图idx = randperm(numel(YTest),9);i = 1:元素个数(idx)次要情节(3 3 i) imshow (XTest (:,:,:, idx(我)));概率= num2str (100 * max(聚合氯化铝(idx(我),:)),3);predClass = char (YPredicted (idx (i)));标签= [predClass,”、“概率,“%”];标题(标签)结束结束

另请参阅

应用程序

功能

相关的话题