使用贝叶斯优化自定义训练实验
这个例子展示了如何使用贝叶斯优化找到最佳hyperparameter定制培训实验值实验管理器。而不是全面hyperparameters您指定一个范围的值为每个hyperparameter并选择一个度量来优化。实验管理器搜索hyperparameters,优化指标的结合。
在本例中,您手写数字的训练一个网络分类图像使用自定义学习速率的时间表。实验使用贝叶斯优化找到最大化的时间表和hyperparameters的组合类型验证精度。更多信息在使用自定义学习速率时间表,看看列车网络的使用自定义训练循环和分段学习产量表。
或者,你可以找到最优hyperparameter值编程方式通过调用bayesopt
函数。有关更多信息,请参见使用贝叶斯优化深度学习。
开放实验
首先,打开示例。实验管理器加载一个预配置实验的项目,你可以检查和运行。开放实验,实验的浏览器面板,双击BayesOptExperiment
。
定制培训实验由一个描述,hyperparameters表和培训功能。实验,使用贝叶斯优化包括额外的选项来限制实验的持续时间。有关更多信息,请参见配置自定义训练实验。
的描述字段包含的文本描述的实验。对于这个例子,描述是:
数字分类,使用两个自定义学习速率时间表:*衰变-使用学习速率p (t) = p (0) / (1 + kt),其中t是迭代数量和k是DecayRate。*分段-学习速率乘以DropFactor每100次迭代。
的Hyperparameters部分指定策略和hyperparameter选项用于实验。对于每个hyperparameter,您可以指定这些选项:
范围——输入一个双元素向量给出了下界和上界的一个真正的或整数值hyperparameter,或一个字符串数组或单元阵列直言hyperparameter可能值的列表。
类型——选择
真正的
对一个实值hyperparameter,整数
为一个整数值hyperparameter或分类
直言hyperparameter。变换——选择
没有一个
使用没有改变日志
使用对数变换。当您选择日志
,hyperparameter值必须是积极的。这个设置,贝叶斯优化算法模型hyperparameter对数刻度。
当您运行实验,实验管理器搜索hyperparameters的最佳组合。每个实验在实验中使用的新组合hyperparameter值基于前面试验的结果。下面的例子使用了hyperparameters时间表
,InitialLearnRate
,DecayRate
,DropFactor
指定自定义学习速率时间用于培训。的选项时间表
是:
衰变
——对于每一次迭代,使用基于时间的学习速率,在那里是迭代数,指定的初始学习速率吗InitialLearnRate
,是指定的衰变率DecayRate
。这个选项忽略hyperparameter的价值DropFactor
。分段
——从指定的初始学习速率InitialLearnRate
并定期滴水的学习速率乘以规定的因素DropFactor
。在这个例子中,每100次迭代学习速率下降。这个选项忽略hyperparameter的价值DecayRate
。
实验模型InitialLearnRate
和DecayRate
在对数刻度,因为这些hyperparameters值的范围跨越好几个数量级,0.001
来0.1
。相比之下,的值DropFactor
范围从0.1
来0.9
,所以实验模型DropFactor
在线性范围内。
下贝叶斯优化选项实验期间,您可以指定在几秒钟内通过输入的最长时间和试验运行的最大数量。最好使用贝叶斯优化的力量,进行至少30目标函数评价。
的培训功能部分指定一个函数,定义了训练数据,网络体系结构,培训方案和培训过程所使用的实验。在MATLAB®编辑器打开这个功能,点击编辑。函数的代码也出现在培训功能。训练的输入函数是一个结构从hyperparameter表和字段experiments.Monitor
对象,您可以使用它来跟踪培训的进度,记录值的指标使用的培训,和生产培训的阴谋。函数返回一个结构,包含训练网络,训练,验证准确性,用于训练和执行环境。实验管理器保存此输出可以出口到MATLAB工作区当培训完成。这些部分:训练函数
初始化输出设置网络的初始值,精度损失,空数组,表明训练还没有开始。实验设置执行环境
“汽车”
,所以火车GPU如果一个可用网络。使用GPU需要并行计算工具箱™和支持GPU设备。万博1manbetx有关更多信息,请参见GPU计算的需求(并行计算工具箱)。
输出。trainedNet = [];output.trainingInfo。损失= [];output.trainingInfo。精度= [];输出。executionEnvironment =“汽车”;
负荷训练数据将实验的训练和验证数据定义为增强使用数字图像数据存储为每个图像数据集。在训练集,实验应用随机翻译5像素的水平和垂直轴。这个数据集的更多信息,请参阅图像数据集。
dataFolder = fullfile (toolboxdir (“nnet”),…“nndemos”,“nndatasets”,“DigitDataset”);imd = imageDatastore (dataFolder,…IncludeSubfolders = true,…LabelSource =“foldernames”);[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9,“随机”);inputSize = [28 28 1];pixelRange = 5 [5];imageAugmenter = imageDataAugmenter (…RandXTranslation = pixelRange,…RandYTranslation = pixelRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,…DataAugmentation = imageAugmenter);augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);类=类别(imdsTrain.Labels);numClasses =元素个数(类);
定义网络体系结构定义了图像分类网络的体系结构。训练网络使用一个自定义训练循环和启用自动分化,训练函数转换层图
dlnetwork
对象。
层= [imageInputLayer (inputSize正常化=“没有”20)convolution2dLayer (5) batchNormalizationLayer () reluLayer () convolution2dLayer(填充= 3,20日“相同”)batchNormalizationLayer () reluLayer () convolution2dLayer(填充= 3,20日“相同”)batchNormalizationLayer () reluLayer () fullyConnectedLayer (numClasses) softmaxLayer ()];lgraph = layerGraph(层);网= dlnetwork (lgraph);
指定培训选项定义使用的培训选择实验。在这个例子中,实验经理列车网络mini-batch大小128 10时代使用自定义学习速率调度hyperparameters定义的。
numEpochs = 10;miniBatchSize = 128;动量= 0.9;learnRateSchedule = params.Schedule;initialLearnRate = params.InitialLearnRate;learnRateDecay = params.DecayRate;learnRateDropFactor = params.DropFactor;learnRateDropPeriod = 100;learnRate = initialLearnRate;
火车模型定义了自定义训练循环使用的实验。自定义训练循环使用
minibatchqueue
处理和管理mini-batches图像。对于每个mini-batch,minibatchqueue
对象的标签转换为一个炎热的变量和编码格式的图像数据维度标签“SSCB”
(空间、空间、通道、批)。默认情况下,minibatchqueue
把数据转换为对象dlarray
对象与基本类型单
。如果你训练GPU,数据转换为gpuArray
(并行计算工具箱)对象。对于每一个时代,自定义训练循环打乱数据存储,循环遍历mini-batches的数据,和损失评估模型,渐变和状态。然后,训练函数决定了学习速率的选择安排并更新网络参数。自定义训练循环的每次迭代后,训练函数计算验证准确性,节省训练网络,并更新培训的进展。
班长。指标= [“LearnRate”“TrainingLoss”“ValidationAccuracy”];班长。包含=“迭代”;兆贝可= minibatchqueue (augimdsTrain,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB”,”“),…OutputEnvironment = output.executionEnvironment);迭代= 0;速度= [];recordMetrics(监控、迭代ValidationAccuracy = 0);为时代= 1:numEpochs shuffle(兆贝可);而hasdata(兆贝可)迭代=迭代+ 1;(X, Y) =下一个(兆贝可);(损失、渐变、状态)= dlfeval (@modelLoss净,X, Y);损失=双(收集(extractdata(损失)));网。=状态;开关learnRateSchedule情况下“衰变”learnRate = initialLearnRate / (1 + learnRateDecay *迭代);情况下“分段”如果国防部(迭代,learnRateDropPeriod) = = 0 learnRate = learnRate * learnRateDropFactor;结束结束recordMetrics(监控、迭代…LearnRate = LearnRate,…TrainingLoss =损失);output.trainingInfo。损失= [output.trainingInfo.loss;迭代损失);(净、速度)= sgdmupdate(净、渐变速度,learnRate动量);如果monitor.Stop返回;结束结束numOutputs = 1;mbqTest = minibatchqueue (augimdsValidation numOutputs,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatchPredictors,…MiniBatchFormat =“SSCB”);predictedLabels = modelPredictions(净、mbqTest、类);trueLabels = imdsValidation.Labels;精度=意味着(predictedLabels = = trueLabels) * 100.0;输出。trainedNet =净;班长。进步=(时代* 100.0)/ numEpochs;recordMetrics(监控、迭代…ValidationAccuracy =准确性);output.trainingInfo。精度= [output.trainingInfo.accuracy;迭代精度);结束
情节混淆矩阵调用
confusionchart
函数创建验证数据的混淆矩阵。培训完成后,审查结果画廊在将来发布混淆矩阵显示一个按钮。的的名字
图的属性指定按钮的名称。您可以点击按钮来显示的混淆矩阵可视化窗格。
图(Name =“混淆矩阵”)confusionchart (trueLabels predictedLabels,…ColumnSummary =“column-normalized”,…RowSummary =“row-normalized”,…Title =“验证数据的混淆矩阵”);
在指标节,优化和方向字段说明贝叶斯优化算法所使用的指标作为目标函数。对于这个实验,实验经理寻求最大化的价值验证精度。
运行实验
当您运行实验,实验管理列车网络多次训练函数定义的。每个试验使用不同的组合hyperparameter值。
培训要花些时间。实验的时间限制,您可以修改贝叶斯优化选项通过减少最大运行时间或试验的最大数量。然而,运行不到30试验可以防止贝叶斯优化算法收敛于最优组hyperparameters。
默认情况下,实验管理器运行一个审判。如果你有并行计算工具箱,您可以同时运行多个试验或卸载实验作为批处理作业在集群:
运行一个审判的一次实验,在实验管理器将来发布,在模式中,选择
顺序
并点击运行。同时,运行多个试验模式中,选择
同时
并点击运行。如果没有当前并行池、实验管理器启动一个集群使用默认配置文件。实验管理器然后运行尽可能多的同时试验有工人在你平行池。为达到最佳效果,在你运行你的实验,开始与尽可能多的工人gpu并行池。有关更多信息,请参见并行使用实验管理器来训练网络和GPU计算的需求(并行计算工具箱)。将实验作为批处理作业,模式中,选择
批处理顺序
或批处理同时
,指定你集群和池大小,然后单击运行。有关更多信息,请参见卸载实验作为集群的批处理作业。
一个表显示的结果为每个审判训练和验证精度损失。实验经理强调了试验所选指标的最优值。例如,在这个实验中,23日审判产生最大的验证精度。
显示培训策划和跟踪每个试验的进展在实验时,审查结果,点击培训策划。培训情节展示了学习速率、培训损失,为每个试验和验证的准确性。例如,这个培训情节是一个试验,使用分段学习速率的时间表。
相比之下,这个培训情节是一个试验,使用基于时间的衰减学习速率的时间表。
评估结果
显示混淆矩阵最好的审判在你的实验中,选择最高的结果表中的行验证精度。然后,在审查结果,点击混淆矩阵
执行额外的计算,导出培训输出工作空间的结构。的trainedNet
这个结构包含了训练网络。
在实验管理器将来发布,点击出口>训练输出。
在对话框窗口中,输入导出的培训工作空间变量的名称输出。默认的名称是
trainingOutput
。
记录对你的实验的结果,添加一个注释。
在结果表中,右键单击ValidationAccuracy细胞最好的审判。
选择添加注释。
在注释窗格中,在文本框中输入你的观察。
有关更多信息,请参见排序、过滤和注释的实验结果。
关闭实验
在实验的浏览器窗格中,右键单击项目并选择的名称关闭项目。实验管理器关闭所有的实验和结果包含在项目中。
培训功能
这个函数指定了训练数据、网络架构、培训方案和培训过程中使用的实验。这个函数的输入是一个结构从hyperparameter表字段和一个experiments.Monitor
对象,您可以使用它来跟踪培训的进度,记录值的指标使用的培训,和生产培训的阴谋。函数返回一个结构,包含训练网络,训练,验证准确性,用于训练和执行环境。实验管理器保存此输出可以出口到MATLAB工作区当培训完成。
函数输出= BayesOptExperiment_training(参数、监控)
初始化输出
输出。trainedNet = [];output.trainingInfo。损失= [];output.trainingInfo。精度= [];输出。executionEnvironment =“汽车”;
负荷训练数据
dataFolder = fullfile (toolboxdir (“nnet”),…“nndemos”,“nndatasets”,“DigitDataset”);imd = imageDatastore (dataFolder,…IncludeSubfolders = true,…LabelSource =“foldernames”);[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9,“随机”);inputSize = [28 28 1];pixelRange = 5 [5];imageAugmenter = imageDataAugmenter (…RandXTranslation = pixelRange,…RandYTranslation = pixelRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,…DataAugmentation = imageAugmenter);augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);类=类别(imdsTrain.Labels);numClasses =元素个数(类);
定义网络体系结构
层= [imageInputLayer (inputSize正常化=“没有”20)convolution2dLayer (5) batchNormalizationLayer () reluLayer () convolution2dLayer(填充= 3,20日“相同”)batchNormalizationLayer () reluLayer () convolution2dLayer(填充= 3,20日“相同”)batchNormalizationLayer () reluLayer () fullyConnectedLayer (numClasses) softmaxLayer ()];lgraph = layerGraph(层);网= dlnetwork (lgraph);
指定培训选项
numEpochs = 10;miniBatchSize = 128;动量= 0.9;learnRateSchedule = params.Schedule;initialLearnRate = params.InitialLearnRate;learnRateDecay = params.DecayRate;learnRateDropFactor = params.DropFactor;learnRateDropPeriod = 100;learnRate = initialLearnRate;
火车模型
班长。指标= [“LearnRate”“TrainingLoss”“ValidationAccuracy”];班长。包含=“迭代”;兆贝可= minibatchqueue (augimdsTrain,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB”,”“),…OutputEnvironment = output.executionEnvironment);迭代= 0;速度= [];recordMetrics(监控、迭代ValidationAccuracy = 0);为时代= 1:numEpochs shuffle(兆贝可);而hasdata(兆贝可)迭代=迭代+ 1;(X, Y) =下一个(兆贝可);(损失、渐变、状态)= dlfeval (@modelLoss净,X, Y);损失=双(收集(extractdata(损失)));网。=状态;开关learnRateSchedule情况下“衰变”learnRate = initialLearnRate / (1 + learnRateDecay *迭代);情况下“分段”如果国防部(迭代,learnRateDropPeriod) = = 0 learnRate = learnRate * learnRateDropFactor;结束结束recordMetrics(监控、迭代…LearnRate = LearnRate,…TrainingLoss =损失);output.trainingInfo。损失= [output.trainingInfo.loss;迭代损失);(净、速度)= sgdmupdate(净、渐变速度,learnRate动量);如果monitor.Stop返回;结束结束numOutputs = 1;mbqTest = minibatchqueue (augimdsValidation numOutputs,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatchPredictors,…MiniBatchFormat =“SSCB”);predictedLabels = modelPredictions(净、mbqTest、类);trueLabels = imdsValidation.Labels;精度=意味着(predictedLabels = = trueLabels) * 100.0;输出。trainedNet =净;班长。进步=(时代* 100.0)/ numEpochs;recordMetrics(监控、迭代…ValidationAccuracy =准确性);output.trainingInfo。精度= [output.trainingInfo.accuracy;迭代精度);结束
情节混淆矩阵
图(Name =“混淆矩阵”)confusionchart (trueLabels predictedLabels,…ColumnSummary =“column-normalized”,…RowSummary =“row-normalized”,…Title =“验证数据的混淆矩阵”);
结束
辅助函数
的modelLoss
函数接受一个dlnetwork
对象净
和mini-batch输入数据X
与相应的标签Y
。函数返回的梯度对可学的参数净
、网络状态和损失。自动计算梯度,函数调用dlgradient
函数。
函数(损失、渐变、状态)= modelLoss(净,X, Y) [YPred、州]=前进(净,X);损失= crossentropy (YPred Y);梯度= dlgradient(损失、net.Learnables);结束
的modelPredictions
函数接受一个dlnetwork
对象净
,一个minibatchqueue
对象兆贝可
和网络类。由迭代函数计算模型预测中的数据minibatchqueue
对象。这个函数使用onehotdecode
函数找到预测类最高的分数。
函数预测= modelPredictions(净、兆贝可类)预测= [];而hasdata(兆贝可)XTest =下一个(兆贝可);YPred =预测(净,XTest);YPred = onehotdecode (YPred、类1)';预测=[预测;YPred];结束结束
的preprocessMiniBatch
函数进行预处理的mini-batch预测和标签使用这些步骤:
使用预处理的图像
preprocessMiniBatchPredictors
函数。从传入单元阵列提取标签数据和连接数据分类沿着二维数组。
一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。
函数(X, Y) = preprocessMiniBatch(伊势亚YCell) X = preprocessMiniBatchPredictors(伊势亚);Y =猫(2,YCell{1:结束});Y, Y = onehotencode (1);结束
的preprocessMiniBatchPredictors
函数进行预处理mini-batch预测因子的提取图像数据从输入单元阵列和数据连接到数字数组。
函数X = preprocessMiniBatchPredictors(伊势亚)X =猫(4,伊势亚{1:结束});结束
另请参阅
应用程序
对象
experiments.Monitor
|dlnetwork
|gpuArray
(并行计算工具箱)