主要内容

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

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

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

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

miniBatchSize = 256;validationFrequency = floor(numl (YTrain)/miniBatchSize);options = 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®编辑器中打开setup函数。此外,setup函数的代码出现在附录1在这个例子的最后。

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

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

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

运行实验

当您运行实验时,实验管理器搜索与所选指标相关的超参数的最佳组合。实验中的每一次试验都使用基于前一次试验结果的超参数值的新组合。

培训可能需要一些时间。要限制实验的持续时间,可以修改贝叶斯优化选项通过减少最大运行时间或最大试验次数。然而,请注意,运行少于30次的试验可能会阻止贝叶斯优化算法收敛到超参数的最优集。

默认情况下,实验管理器每次运行一个试验。如果您有并行计算工具箱™,您可以同时运行多个试验,或者将试验卸载为集群中的批处理作业。

  • 一次做一个试验,在实验管理器将来发布,在模式中,选择顺序并点击运行

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

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

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

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

评估结果

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

要显示所选试验的混淆矩阵,请在审查结果,点击验证数据

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

  1. 实验管理器将来发布,点击出口>训练网络

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

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

testSummary (trainedNetwork)

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

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

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

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

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

******************************************
试验错误率:0.1829标准误差:0.0039 95%置信区间:[0.1753,0.1905]
******************************************

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

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

  2. 选择添加注释

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

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

关闭实验

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

附录1:Setup函数

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

输入

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

输出

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

  • 是定义神经网络体系结构的层图。

  • 选项是一个trainingOptions对象。

函数[augimdsTrain,layers,options] = BayesOptExperiment_setup1(params) datadir = tempdir;downloadCIFARData (datadir);[XTrain,YTrain,XTest,YTest] = loadCIFARData(datadir);idx = randperm(numel(YTest),5000);XValidation = XTest(:,:,:,idx);YValidation = YTest(idx);imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter(...RandXReflection = true,...RandXTranslation = pixelRange,...RandYTranslation = pixelRange);augimdsTrain = augmentedImageDatastore(imageSize,XTrain,YTrain,...DataAugmentation = imageAugmenter);numClasses = numel(unique(YTrain));numF = round(16/√(params.SectionDepth));layers = [imageInputLayer(imageSize) convBlock(3,numF,params.SectionDepth) maxPooling2dLayer(3,Stride=2,Padding= .“相同”maxPooling2dLayer(3,Stride=2,Padding= .“相同”) convBlock(3,4*numF,params.SectionDepth) averagePooling2dLayer(8) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];miniBatchSize = 256;validationFrequency = floor(numl (YTrain)/miniBatchSize);options = 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 = [convolution2dLayer(filterSize,numFilters,Padding= .“相同”;;;;layers = repmat(layers,numConvLayers,1);结束

附录3:计算错误率

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

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

  • trainingInfo控件返回的包含培训信息的结构是否为trainNetwork函数。

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

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

函数metricOutput = ErrorRate(trialInfo) datadir = tempdir;[~,~,XTest,YTest] = loadCIFARData(datadir);idx = randperm(numel(YTest),5000);XTest = XTest(:,:,:,idx);YTest = YTest(idx);yexpected = category (trialInfo.trainedNetwork,XTest);metricOutput = 1 -平均值(yexpected == YTest);结束

附录4:总结测试统计信息

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

函数testSummary(net) datadir = tempdir;[~,~,XTest,YTest] = loadCIFARData(datadir);[yexpected,probs] = category (net,XTest);testError = 1 -均值(yexpected == 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", 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(我)));Prob = num2str(100*max(pros (idx(i),:)),3);predClass = string(yexpected (idx(i)));label = predClass+”:“+问题+“%”;标题(标签)结束结束

另请参阅

应用程序

功能

相关的话题