matlab使用貝葉斯優化的深度學習

原文連接:http://tecdat.cn/?p=7954

此示例說明如何將貝葉斯優化應用於深度學習,以及如何爲卷積神經網絡找到最佳網絡超參數和訓練選項。算法

要訓練深度神經網絡,必須指定神經網絡架構以及訓練算法的選項。選擇和調整這些超參數可能很困難而且須要時間。貝葉斯優化是一種很是適合用於優化分類和迴歸模型的超參數的算法。 網絡

 

準備數據

下載CIFAR-10數據集[1]。該數據集包含60,000張圖像,每一個圖像的大小爲32 x 32和三個顏色通道(RGB)。整個數據集的大小爲175 MB。 架構

加載CIFAR-10數據集做爲訓練圖像和標籤,並測試圖像和標籤。 函數

[XTrain,YTrain,XTest,YTest] = loadCIFARData(datadir);idx = randperm(numel(YTest),5000);XValidation = XTest(:,:,:,idx);XTest(:,:,:,idx) = [];YValidation = YTest(idx);YTest(idx) = [];

您可使用如下代碼顯示訓練圖像的樣本。學習

figure; idx = randperm(numel(YTrain),20); for i = 1:numel(idx) subplot(4,5,i); imshow(XTrain(:,:,:,idx(i))); end

選擇要優化的變量

選擇要使用貝葉斯優化進行優化的變量,並指定要搜索的範圍。此外,指定變量是否爲整數以及是否在對數空間中搜索區間。優化如下變量:測試

  • 網絡部分的深度。此參數控制網絡的深度。該網絡具備三個部分,每一個部分具備SectionDepth相同的卷積層。所以,卷積層的總數爲3*SectionDepth。腳本後面的目標函數將每一層中的卷積過濾器數量與成正比1/sqrt(SectionDepth)。結果,對於不一樣的截面深度,每次迭代的參數數量和所需的計算量大體相同。
  •  最佳學習率取決於您的數據以及您正在訓練的網絡。
  • 隨機梯度降低動量。 
  • L2正則化強度。 
optimVars = [optimizableVariable('SectionDepth',[1 3],'Type','integer')optimizableVariable('InitialLearnRate',[1e-2 1],'Transform','log')optimizableVariable('Momentum',[0.8 0.98])optimizableVariable('L2Regularization',[1e-10 1e-2],'Transform','log')];

執行貝葉斯優化

使用訓練和驗證數據做爲輸入,爲貝葉斯優化器建立目標函數。目標函數訓練卷積神經網絡,並在驗證集上返回分類偏差。 優化

ObjFcn = makeObjFcn(XTrain,YTrain,XValidation,YValidation);

經過最小化驗證集上的分類偏差來執行貝葉斯優化。 爲了充分利用貝葉斯優化的功能,您應該至少執行30個目標函數評估。 lua

每一個網絡完成訓練後,bayesopt將結果打印到命令窗口。bayesopt而後該函數返回中的文件名BayesObject.UserDataTrace。目標函數將訓練有素的網絡保存到磁盤,並將文件名返回給bayesoptspa

 
|===================================================================================================================================|| Iter | Eval | Objective | Objective | BestSoFar | BestSoFar | SectionDepth | InitialLearn-| Momentum | L2Regulariza-|| | result | | runtime | (observed) | (estim.) | | Rate | | tion ||===================================================================================================================================|| 1 | Best | 0.19 | 2201 | 0.19 | 0.19 | 3 | 0.012114 | 0.8354 | 0.0010624 |
| 2 | Accept | 0.3224 | 1734.1 | 0.19 | 0.19636 | 1 | 0.066481 | 0.88231 | 0.0026626 |
| 3 | Accept | 0.2076 | 1688.7 | 0.19 | 0.19374 | 2 | 0.022346 | 0.91149 | 8.242e-10 |
| 4 | Accept | 0.1908 | 2167.2 | 0.19 | 0.1904 | 3 | 0.97586 | 0.83613 | 4.5143e-08 |
| 5 | Accept | 0.1972 | 2157.4 | 0.19 | 0.19274 | 3 | 0.21193 | 0.97995 | 1.4691e-05 |
| 6 | Accept | 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 | Accept | 0.8116 | 1989.7 | 0.1882 | 0.18818 | 3 | 0.42085 | 0.95355 | 0.0092026 |
| 9 | Accept | 0.1986 | 1836 | 0.1882 | 0.18821 | 2 | 0.030291 | 0.94711 | 2.5062e-05 |
| 10 | Accept | 0.2146 | 1909.4 | 0.1882 | 0.18816 | 2 | 0.013379 | 0.8785 | 7.6354e-09 |
| 11 | Accept | 0.2194 | 1562 | 0.1882 | 0.18815 | 1 | 0.14682 | 0.86272 | 8.6242e-09 |
| 12 | Accept | 0.2246 | 1591.2 | 0.1882 | 0.18813 | 1 | 0.70438 | 0.82809 | 1.0102e-06 |
| 13 | Accept | 0.2648 | 1621.8 | 0.1882 | 0.18824 | 1 | 0.010109 | 0.89989 | 1.0481e-10 |
| 14 | Accept | 0.2222 | 1562 | 0.1882 | 0.18812 | 1 | 0.11058 | 0.97432 | 2.4101e-07 |
| 15 | Accept | 0.2364 | 1625.7 | 0.1882 | 0.18813 | 1 | 0.079381 | 0.8292 | 2.6722e-05 |
| 16 | Accept | 0.26 | 1706.2 | 0.1882 | 0.18815 | 1 | 0.010041 | 0.96229 | 1.1066e-05 |
| 17 | Accept | 0.1986 | 2188.3 | 0.1882 | 0.18635 | 3 | 0.35949 | 0.97824 | 3.153e-07 |
| 18 | Accept | 0.1938 | 2169.6 | 0.1882 | 0.18817 | 3 | 0.024365 | 0.88464 | 0.00024507 |
| 19 | Accept | 0.3588 | 1713.7 | 0.1882 | 0.18216 | 1 | 0.010177 | 0.89427 | 0.0090342 |
| 20 | Accept | 0.2224 | 1721.4 | 0.1882 | 0.18193 | 1 | 0.09804 | 0.97947 | 1.0727e-10 |
|===================================================================================================================================|| Iter | Eval | Objective | Objective | BestSoFar | BestSoFar | SectionDepth | InitialLearn-| Momentum | L2Regulariza-|| | result | | runtime | (observed) | (estim.) | | Rate | | tion ||===================================================================================================================================|| 21 | Accept | 0.1904 | 2184.7 | 0.1882 | 0.18498 | 3 | 0.017697 | 0.95057 | 0.00022247 |
| 22 | Accept | 0.1928 | 2184.4 | 0.1882 | 0.18527 | 3 | 0.06813 | 0.9027 | 1.3521e-09 |
| 23 | Accept | 0.1934 | 2183.6 | 0.1882 | 0.1882 | 3 | 0.018269 | 0.90432 | 0.0003573 |
| 24 | Accept | 0.303 | 1707.9 | 0.1882 | 0.18809 | 1 | 0.010157 | 0.88226 | 0.00088737 |
| 25 | Accept | 0.194 | 2189.1 | 0.1882 | 0.18808 | 3 | 0.019354 | 0.94156 | 9.6197e-07 |
| 26 | Accept | 0.2192 | 1752.2 | 0.1882 | 0.18809 | 1 | 0.99324 | 0.91165 | 1.1521e-08 |
| 27 | Accept | 0.1918 | 2185 | 0.1882 | 0.18813 | 3 | 0.05292 | 0.8689 | 1.2449e-05 |
__________________________________________________________
Optimization completed.MaxTime of 50400 seconds reached.Total function evaluations: 27Total elapsed time: 51962.3666 seconds.Total objective function evaluation time: 51942.8833Best observed feasible point:SectionDepth InitialLearnRate Momentum L2Regularization____________ ________________ ________ ________________3 0.1722 0.8019 4.2149e-06Observed objective function value = 0.1882Estimated objective function value = 0.18813Function evaluation time = 2257.4627Best estimated feasible point (according to models):SectionDepth InitialLearnRate Momentum L2Regularization____________ ________________ ________ ________________3 0.1722 0.8019 4.2149e-06Estimated objective function value = 0.18813Estimated function evaluation time = 2166.2402

評估最終網絡

加載優化中發現的最佳網絡及其驗證準確性。3d

valError = 0.1882

預測測試集的標籤並計算測試偏差。將測試集中每一個圖像的分類視爲具備必定成功機率的獨立事件,這意味着錯誤分類的圖像數量遵循二項式分佈。使用它來計算標準偏差(testErrorSE)和testError95CI廣義偏差率的大約95%置信區間()。這種方法一般稱爲_Wald方法_。 

 
testError = 0.1864
 
testError95CI = 1×20.1756 0.1972

繪製混淆矩陣以獲取測試數據。經過使用列和行摘要顯示每一個類的精度和召回率。

 

您可使用如下代碼顯示一些測試圖像及其預測的類以及這些類的機率。

優化目標函數

定義用於優化的目標函數。 

定義卷積神經網絡架構。

  • 在卷積層上添加填充,以便空間輸出大小始終與輸入大小相同。
  • 每次使用最大池化層對空間維度進行2倍的下采樣時,將過濾器的數量增長2倍。這樣作可確保每一個卷積層所需的計算量大體相同。
  • 選擇與成正比的濾波器數量,以1/sqrt(SectionDepth)使不一樣深度的網絡具備大體相同數量的參數,而且每次迭代所需的計算量大體相同。要增長網絡參數的數量和總體網絡靈活性,請增長numF。要訓練更深的網絡,請更改SectionDepth變量的範圍。
  • 使用convBlock(filterSize,numFilters,numConvLayers)建立的塊numConvLayers卷積層,每一個具備指定filterSizenumFilters過濾器,而且每一個隨後分批正常化層和RELU層。該convBlock函數在本示例的末尾定義。

 指定驗證數據,而後選擇一個'ValidationFrequency'值,以便trainNetwork每一個時期對網絡進行一次驗證。訓練固定的時期數,並在最後一個時期將學習率下降10倍。這減小了參數更新的噪音,並使網絡參數的沉降更接近損耗函數的最小值。

 

使用數據加強可沿垂直軸隨機翻轉訓練圖像,並將它們隨機水平和垂直轉換爲四個像素。

 

訓練網絡並在訓練過程當中繪製訓練進度。

 

在驗證集上評估通過訓練的網絡,計算預測的圖像標籤,並在驗證數據上計算錯誤率。

 

建立一個包含驗證錯誤的文件名,而後將網絡,驗證錯誤和培訓選項保存到磁盤。目標函數fileName做爲輸出參數bayesopt返回,並返回中的全部文件名BayesObject.UserDataTrace

convBlock函數建立一個numConvLayers卷積層塊,每一個卷積層都有一個指定的filterSizenumFilters過濾器,每一個卷積層後面都有一個批處理歸一化層和一個ReLU層。

 

參考文獻

[1]克里熱夫斯基,亞歷克斯。「從微小的圖像中學習多層功能。」 (2009)。https://www.cs.toronto.edu/~k...

相關文章
相關標籤/搜索