使用贝叶斯优化的深度学习

这个例子展示了如何将贝叶斯优化应用到深度学习中,为卷积神经网络找到最优的网络超参数和训练选项。

要训练一个深度神经网络,您必须指定神经网络架构,以及训练算法的选项。选择和调优这些超参数可能很困难,而且需要时间。贝叶斯优化算法是一种非常适合于分类和回归模型超参数优化的算法。您可以使用贝叶斯优化来优化不可微、不连续和耗时的函数。该算法内部维护目标函数的高斯过程模型,并利用目标函数评价对该模型进行训练。

这个例子展示了如何:

  • 下载并准备用于网络训练的CIFAR-10数据集。该数据集是测试图像分类模型使用最广泛的数据集之一。

  • 使用贝叶斯优化指定要优化的变量。这些变量是训练算法的选项,也是网络结构本身的参数。

  • 定义目标函数,以优化变量的值为输入,指定网络架构和培训选项,对网络进行培训和验证,并将培训后的网络保存到磁盘上。objective函数在脚本的末尾定义。

  • 通过最小化验证集上的分类错误来执行贝叶斯优化。

  • 从磁盘加载最好的网络,并在测试集中对其进行评估。

准备数据

下载CIFAR-10数据集[1]。该数据集包含60000张图像,每张图像的大小为32x32,有3个彩色通道(RGB)。整个数据集的大小是175mb。根据你的互联网连接,下载过程可能需要一些时间。

datadir = tempdir;downloadCIFARData (datadir);

加载CIFAR-10数据集作为训练图像和标签,以及测试图像和标签。要启用网络验证,请使用5000个测试映像进行验证。

[XTrain、YTrain XTest,欧美]= loadCIFARData (datadir);idx = randperm(元素个数(欧美),5000);XValidation = XTest (:,:,:, idx);XTest (::,:, idx) = [];YValidation =欧美(idx);欧美(idx) = [];

您可以使用以下代码显示训练图像的示例。

图;idx = randperm(元素个数(YTrain), 20);I = 1:numel(idx) subplot(4,5, I);imshow (XTrain (:,:,:, idx(我)));结束

选择优化变量

选择使用贝叶斯优化优化的变量,并指定搜索范围。另外,指定变量是否为整数以及是否在对数空间中搜索区间。优化以下变量:

  • 网络部分的深度。该参数控制网络的深度。这个网络有三个部分,每个部分都有SectionDepth相同的卷积层。所以卷积层的总数是3 * SectionDepth.脚本后面的目标函数将每一层的卷积过滤器的数量与成比例1 /√(SectionDepth).因此,对于不同的剖面深度,每次迭代的参数数量和所需的计算量大致相同。

  • 最初的学习速率。最佳学习率取决于你的数据以及你所训练的网络。

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

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

optimizablevvariable = [optimizablevvariable (“SectionDepth”3 [1],“类型”“整数”) optimizableVariable (“InitialLearnRate”(1)依照1),“转换”“日志”) optimizableVariable (“动量”[0.8 - 0.98]) optimizableVariable (“L2Regularization”(1)平台以及1依照),“转换”“日志”));

执行贝叶斯优化

使用训练和验证数据作为输入,为贝叶斯优化器创建目标函数。目标函数训练卷积神经网络并返回验证集上的分类误差。这个函数在脚本的末尾定义。因为bayesopt利用验证集上的错误率来选择最佳模型,最终的网络有可能在验证集上过拟。最后选择的模型在独立测试集上进行测试,估计泛化误差。

ObjFcn = makeObjFcn (XTrain YTrain、XValidation YValidation);

通过最小化验证集上的分类错误来执行贝叶斯优化。指定总优化时间(以秒为单位)。为了最好地利用贝叶斯优化的力量,您应该执行至少30个目标函数评估。要在多个gpu上并行训练网络,请设置“UseParallel”价值真正的.如果你有一个单一的图形处理器,并设置“UseParallel”价值真正的,那么所有工作人员都共享该GPU,而您没有获得培训加速,并增加GPU耗尽内存的机会。

每个网络完成训练后,bayesopt将结果打印到命令窗口。的bayesopt函数然后返回文件名BayesObject。使用rDataTrace.目标函数将训练过的网络保存到磁盘,并返回文件名bayesopt

BayesObject = bayesopt (ObjFcn optimVars,...“MaxTime”14 * 60 * 60,...“IsObjectiveDeterministic”假的,...“UseParallel”、假);
|===================================================================================================================================| | Iter | Eval客观客观| | | BestSoFar | BestSoFar | SectionDepth | InitialLearn——| |势头L2Regulariza——| | |结果| | |运行时(观察)| (estim) | |率| | ||===================================================================================================================================| | 最好1 | | 0.19 | 2201 | 0.19 | 0.19 | 3 | 0.012114 | 0.8354 | 0.0010624 |
| 2 |接受| 0.3224 | 1734.1 | 0.19 | 0.19636 | 1 | 0.066481 | 0.88231 | 0.0026626 |
| 3 |接受| 0.2076 | 1688.7 | 0.19 | 0.19374 | 2 | 0.022346 | 0.91149 | 8.242e-10 |
| 4 |接受| 0.1908 | 2167.2 | 0.19 | 0.1904 | 3 | 0.97586 | 0.83613 | 4.5143e-08 |
| 5 |接受| 0.1972 | 2157.4 | 0.19 | 0.19274 | 3 | 0.21193 | 0.97995 | 1.4691e-05 |
| 6 |接受| 0.2594 | 2152.8 | 0.19 | 0.19 | 3 | 0.98723 | 0.97931 | 2.4847e-10 |
| 7 | Best | 0.1882 | 2257.5 | 0.1882 | 0.18819 | 3 | 0.1722 | 0.8019 | 4.2149e-06 |
| 8 |接受| 0.8116 | 1989.7 | 0.1882 | 0.18818 | 3 | 0.42085 | 0.95355 | 0.0092026 |
| 9 |接受| 0.1986 | 1836 | 0.1882 | 0.18821 | 2 | 0.030291 | 0.94711 | 2.5062e-05 |
| 10 |接受| 0.2146 | 1909.4 | 0.1882 | 0.18816 | 2 | 0.013379 | 0.8785 | 7.6354e-09 |
| 11 |接受| 0.2194 | 1562 | 0.1882 | 0.18815 | 1 | 0.14682 | 0.86272 | 8.6242e-09 |
| 12 |接受| 0.2246 | 1591.2 | 0.1882 | 0.18813 | 1 | 0.70438 | 0.82809 | 1.0102e-06 |
| 13 |接受| 0.2648 | 1621.8 | 0.1882 | 0.18824 | 1 | 0.010109 | 0.9989 | 1.0481e-10 |
| 14 |接受| 0.2222 | 1562 | 0.1882 | 0.18812 | 1 | 0.11058 | 0.97432 | 2.4101e-07 |
| 15 |接受| 0.2364 | 1625.7 | 0.1882 | 0.18813 | 1 | 0.079381 | 0.8292 | 2.6722e-05 |
| 16 |接受| 0.26 | 1706.2 | 0.1882 | 0.18815 | 1 | 0.010041 | 0.96229 | 1.1066e-05 |
| 17 |接受| 0.1986 | 2188.3 | 0.1882 | 0.18635 | 3 | 0.35949 | 0.97824 | 3.153e-07 |
| 18 |接受| 0.1938 | 2169.6 | 0.1882 | 0.18817 | 3 | 0.024365 | 0.88464 | 0.00024507 |
| 19 |接受| 0.3588 | 1713.7 | 0.1882 | 0.18216 | 1 | 0.010177 | 0.89427 | 0.0090342 |
| 20 |接受| 0.2224 | 1721.4 | 0.1882 | 0.18193 | 1 | 0.09804 | 0.97947 | 1.0727e-10 |
|===================================================================================================================================| | Iter | Eval客观客观| | | BestSoFar | BestSoFar | SectionDepth | InitialLearn——| |势头L2Regulariza——| | |结果| | |运行时(观察)| (estim) | |率| | ||===================================================================================================================================| | 21日|接受| 0.1904 | 2184.7 | 0.1882 | 0.18498 | 3 | 0.017697 | 0.95057 | 0.00022247 |
| 22 |接受| 0.1928 | 2184.4 | 0.1882 | 0.18527 | 3 | 0.06813 | 0.9027 | 1.3521e-09 |
| 23 |接受| 0.1934 | 2183.6 | 0.1882 | 0.1882 | 3 | 0.018269 | 0.90432 | 0.0003573 |
| 24 |接受| 0.303 | 1707.9 | 0.1882 | 0.18809 | 1 | 0.010157 | 0.88226 | 0.00088737 |
| 25 |接受| 0.194 | 2189.1 | 0.1882 | 0.18808 | 3 | 0.019354 | 0.94156 | 9.6197e-07 |
| 26 |接受| 0.2192 | 1752.2 | 0.1882 | 0.18809 | 1 | 0.99324 | 0.91165 | 1.1521e-08 |
| 27 |接受| 0.1918 | 2185 | 0.1882 | 0.18813 | 3 | 0.05292 | 0.8689 | 1.2449e-05 |

__________________________________________________________ 优化完成。MaxTime达到50400秒。总函数计算:27总运行时间:51962.3666秒。总目标函数评价时间:51942.8833SectionDepth InitialLearnRate Momentum L2Regularization ____________ ________________ ________ ________________ 3 0.1722 0.8019 4.2149e-06 Observed objective function value = 0.1882 Estimated objective function value = 0.18813 function evaluation time = 2257.4627 Best Estimated feasible point (according to models):SectionDepth InitialLearnRate Momentum L2Regularization ____________ ________________ ________ ________________ 3 0.1722 0.8019 4.2149e-06 Estimated objective function value = 0.18813 Estimated function evaluation time = 2166.2402

评估最终的网络

加载优化中发现的最佳网络及其验证精度。

bestIdx = BayesObject.IndexOfMinimumTrace(结束);文件名= BayesObject.UserDataTrace {bestIdx};savedStruct =负载(文件名);valError = savedStruct.valError
valError = 0.1882

预测测试集的标签并计算测试误差。将测试集中的每一幅图像的分类视为具有一定成功概率的独立事件,即错误分类图像的数量服从二项分布。用这个计算标准误差(testErrorSE)及近似的95%置信区间(testError95CI的概化错误率。这种方法通常被称为瓦尔德方法bayesopt使用验证集确定最佳网络,而不将网络公开给测试集。这样,测试错误就有可能高于验证错误。

(YPredicted,聚合氯化铝)= (savedStruct.trainedNet XTest)进行分类;testror = 1 - mean(YPredicted == YTest)
testError = 0.1864
元=元素个数(欧美);testErrorSE =√testError * (1-testError) / nt);testror95ci = [testror - 1.96* testrorse, testror + 1.96* testrorse]
testError95CI =1×20.1756 - 0.1972

绘制测试数据的混淆矩阵。通过使用列和行摘要显示每个类的精度和召回率。

图(“单位”“归一化”“位置”,[0.2 0.2 0.4 0.4]);厘米= confusionchart(欧美,YPredicted);厘米。Title =“测试数据的混淆矩阵”;厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”

您可以使用以下代码显示一些测试图像及其预测的类和这些类的概率。

图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,”、“概率,“%”];标题(标签)结束

优化目标函数

定义优化的目标函数。该函数执行如下步骤:

  1. 将优化变量的值作为输入。bayesopt使用表中每个列名等于变量名的优化变量的当前值来调用目标函数。例如,网络分段深度的当前值为optVars。SectionDepth

  2. 定义网络架构和培训选项。

  3. 培训和验证网络。

  4. 将训练过的网络、验证错误和训练选项保存到磁盘。

  5. 返回验证错误和保存的网络的文件名。

函数ObjFcn = makeObjFcn(XTrain,YTrain,XValidation,YValidation) ObjFcn = @valErrorFun;函数[valError,缺点,文件名]= valErrorFun (optVars)

定义卷积神经网络结构。

  • 向卷积层添加填充,使空间输出大小始终与输入大小相同。

  • 每次使用最大池化层对空间维度进行因子2的采样时,将过滤器的数量增加因子2。这样做可以确保每个卷积层所需的计算量大致相同。

  • 选择与滤镜数量成正比的1 /√(SectionDepth),因此不同深度的网络具有大致相同数量的参数,每次迭代所需的计算量也大致相同。增加网络参数的数量和整体网络的灵活性numF.为了训练更深入的网络,改变范围SectionDepth变量。

  • 使用convBlock (filterSize numFilters numConvLayers)创造一个块numConvLayers卷积层,每个具有指定的filterSizenumFilters过滤器,然后是批处理规格化层和ReLU层。的convBlock函数在本例的最后定义。

imageSize = [32 32 3];numClasses =元素个数(独特(YTrain));numF =轮(16 /√(optVars.SectionDepth));images = [imageInputLayer(imageSize)]%这些卷积的空间输入和输出大小%层是32 × 32,下面是最大池化层%将其减少为16乘16。convBlock (3 numF optVars.SectionDepth) maxPooling2dLayer (3“步”2,“填充”“相同”%这些卷积的空间输入和输出大小%层是16 * 16,下面是最大池化层%将它减少为8 × 8。convBlock (3 2 * numF optVars.SectionDepth) maxPooling2dLayer (3“步”2,“填充”“相同”%这些卷积的空间输入和输出大小%层是8 × 8的。全球平均池层平均值%除以8乘8的输入,给出一个大小的输出% 1-by-1-by-4 * initialNumFilters。全球平均水平%池化层,最终分类输出仅为中出现的每个特性的总数量敏感%输入图像,但对空间位置不敏感%的特性。convBlock(3、4 * numF optVars.SectionDepth) averagePooling2dLayer (8)%添加完全连接层和最终的softmax和%分类层。fullyConnectedLayer (numClasses) softmaxLayer classificationLayer];

指定网络训练选项。优化初始学习率、SGD动量和L2正则化强度。

指定验证数据并选择“ValidationFrequency”值,这样trainNetwork每个epoch验证一次网络。训练固定数量的纪元,并在最后的纪元期间降低10倍的学习率。这减少了参数更新的噪声,并让网络参数更接近于损失函数的最小值。

miniBatchSize = 256;validationFrequency =地板(元素个数(YTrain) / miniBatchSize);选择= trainingOptions (“个”...“InitialLearnRate”, optVars。InitialLearnRate,...“动量”, optVars。动力,...“MaxEpochs”现年60岁的...“LearnRateSchedule”“分段”...“LearnRateDropPeriod”现年40岁的...“LearnRateDropFactor”, 0.1,...“MiniBatchSize”miniBatchSize,...“L2Regularization”, optVars。L2Regularization,...“洗牌”“every-epoch”...“详细”假的,...“阴谋”“训练进步”...“ValidationData”{XValidation, YValidation},...“ValidationFrequency”, validationFrequency);

使用数据增强沿垂直轴随机翻转训练图像,并随机将其水平和垂直平移到4个像素。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。

pixelRange = [-4 4];imageAugmenter = imageDataAugmenter (...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);数据源= augmentedImageDatastore(图象尺寸、XTrain YTrain,“DataAugmentation”, imageAugmenter);

培训网络,并在培训过程中绘制培训进度。训练结束后关闭所有训练场地。

trainedNet = trainNetwork(数据源、层、期权);关闭(findall(大的,“标签”“NNET_CNN_TRAININGPLOT_FIGURE”))

评估验证集上训练的网络,计算预测的图像标签,计算验证数据的错误率。

YPredicted =分类(trainedNet XValidation);valError = 1 - mean(YPredicted == YValidation);

创建一个包含验证错误的文件名,并将网络、验证错误和培训选项保存到磁盘。目标函数返回文件名作为输出参数,和bayesopt返回所有的文件名BayesObject。使用rDataTrace.额外所需的输出参数缺点指定变量之间的约束。没有变量约束。

fileName = num2str(valError) +“.mat”;保存(文件名,“trainedNet”“valError”“选项”) cons = [];结束结束

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

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

参考文献

[1] Krizhevsky,亚历克斯。“从微小图像中学习多层特征。”(2009)。https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf

另请参阅

||

相关的话题