Matlab搭建AlexNet实现手写数字识别
Matlab搭建AlexNet實現手寫數字識別
個人博客地址
文章目錄
- Matlab搭建AlexNet實現手寫數字識別
- 環境
- 內容
- 步驟
- 準備MNIST數據集
- 數據預處理
- 定義網絡模型
- 定義訓練超參數
- 網絡訓練和預測
- 代碼下載
環境
- Matlab 2020a
- Windows10
內容
使用Matlab對MNIST數據集進行預處理,搭建卷積神經網絡進行訓練,實現識別手寫數字的任務。在訓練過程中,每隔30個batch輸出一次模型在驗證集上的準確率和損失值。在訓練結束后會輸出驗證集中每個數字的真實值、網絡預測值和判定概率,并給出總的識別準確率。
步驟
準備MNIST數據集
為了方便進行測試,本次只選用500張MNIST數據集,每個數字50張。
下載數據集后并解壓,為每個數字創建單獨文件夾并將該數字的所有圖片放在對應的文件夾下,如圖1所示。
數據集下載地址 提取碼:af6n
手動分類結束后每個文件夾中應有50張圖片。
數據預處理
% 加載數據集 imds = imageDatastore(..."./data",...'IncludeSubfolders', true,...'LabelSource','foldernames');使用imageDatastore加載數據集。第一個參數填寫數據集路徑。由于本次實驗data目錄下含有子文件夾所以IncludeSubfolders需要指定為true。LabelSource表示標簽來源,這里使用文件夾名字來代表標簽。
ImageDatastore - 屬性:Files: {'D:\data\0\0_1.bmp';'D:\data\0\0_10.bmp';'D:\data\0\0_11.bmp'... and 497 more}Folders: {'D:\data'}Labels: [0; 0; 0 ... and 497 more categorical]AlternateFileSystemRoots: {}ReadSize: 1SupportedOutputFormats: [1×5 string]DefaultOutputFormat: "png"ReadFcn: @readDatastoreImage上面內容為執行imageDatastore后返回變量的屬性。可以看出已經成功將數據集讀入并對每張圖片進行label處理。
由于每個數字有50張圖像,因此本次實驗每個數字選用30張進行訓練,另20張進行驗證。使用splitEachLabel進行劃分,得到訓練集和驗證集。
% 數據打亂 imds = shuffle(imds);% 劃分訓練集和驗證集。每一個類別訓練集有30個,驗證集有20個 [imdsTrain,imdsValidation] = splitEachLabel(imds, 30);使用shuffle進行數據打亂。得到的imdsTrain和imdsValidation分別有300和200張圖片。
% 將訓練集與驗證集中圖像的大小調整成與輸入層的大小相同 augimdsTrain = augmentedImageDatastore([28 28],imdsTrain); augimdsValidation = augmentedImageDatastore([28 28],imdsValidation);定義網絡模型
% 構建alexnet卷積網絡 alexnet = [imageInputLayer([56,56,1], 'Name', 'Input')convolution2dLayer([11,11],48,'Padding','same','Stride',4, 'Name', 'Conv_1')batchNormalizationLayer('Name', 'BN_1')reluLayer('Name', 'Relu_1')maxPooling2dLayer(3,'Padding','same','Stride',2, 'Name', 'MaxPooling_1')convolution2dLayer([5,5],128,'Padding',2,'Stride',1, 'Name', 'Conv_2')batchNormalizationLayer('Name', 'BN_2')reluLayer('Name', 'Relu_2')maxPooling2dLayer(3,'Padding','same','Stride',2, 'Name', 'MaxPooling_2')convolution2dLayer([3 3],192,'Padding',1,'Stride',1, 'Name', 'Conv_3')batchNormalizationLayer('Name', 'BN_3')reluLayer('Name', 'Relu_3')convolution2dLayer([3 3],192,'Padding',1,'Stride',1, 'Name', 'Conv_4')batchNormalizationLayer('Name', 'BN_4')reluLayer('Name', 'Relu_4')convolution2dLayer([3 3],128,'Stride',1,'Padding',1, 'Name', 'Conv_5')batchNormalizationLayer('Name', 'BN_5')reluLayer('Name', 'Relu_5')maxPooling2dLayer(3,'Padding','same','Stride',2, 'Name', 'MaxPooling_3')fullyConnectedLayer(4096, 'Name', 'FC_1')reluLayer('Name', 'Relu_6')fullyConnectedLayer(4096, 'Name', 'FC_2')reluLayer('Name', 'Relu_7')fullyConnectedLayer(10, 'Name', 'FC_3') % 將新的全連接層的輸出設置為訓練數據中的種類softmaxLayer('Name', 'Softmax') % 添加新的Softmax層classificationLayer('Name', 'Output') ]; % 添加新的分類層使用上面的代碼即可構建AlexNet模型。
% 對構建的網絡進行可視化分析 lgraph = layerGraph(mynet); analyzeNetwork(lgraph)定義訓練超參數
% 配置訓練選項 options = trainingOptions('sgdm', ...'InitialLearnRate',0.001, ... 'MaxEpochs',100, ... 'Shuffle','every-epoch', ...'ValidationData',augimdsValidation, ...'ValidationFrequency',30, ...'Verbose',true, ...'Plots','training-progress');本次實驗選用sgdm作為優化器,初始學習率設置為0.001,最大迭代次數為100,每次迭代都會打亂數據,每隔30個batch進行一次驗證。
網絡訓練和預測
% 對網絡進行訓練 net = trainNetwork(augimdsTrain, mynet, options); % 將訓練好的網絡用于對新的輸入圖像進行分類,得到預測結果和判定概率 [YPred, err] = classify(net, augimdsValidation);其中,YPred是存放網絡對驗證集預測結果的數組,err存放著每個數字的判定概率。
% 打印真實數字、預測數字、判定概率和準確率 YValidation = imdsValidation.Labels; for i=1:200 fprintf("真實數字:%d 預測數字:%d", double(YValidation(i,1))-1, double(YPred(i, 1))-1); fprintf(" 判定概率:%f\n", max(err(i, :))); end運行上面代碼即可打印相關結果。
... ... 真實數字:4 預測數字:4 判定概率:0.814434 真實數字:0 預測數字:0 判定概率:0.657829 真實數字:8 預測數字:8 判定概率:0.874560 真實數字:0 預測數字:0 判定概率:0.988826 真實數字:6 預測數字:6 判定概率:0.970034 ... ... 真實數字:5 預測數字:5 判定概率:0.806220 真實數字:4 預測數字:4 判定概率:0.938233 真實數字:7 預測數字:7 判定概率:0.906994 真實數字:7 預測數字:7 判定概率:0.837794 真實數字:6 預測數字:6 判定概率:0.951572 真實數字:6 預測數字:1 判定概率:0.415834 真實數字:5 預測數字:5 判定概率:0.789031 真實數字:2 預測數字:2 判定概率:0.363526 真實數字:7 預測數字:7 判定概率:0.930049準確率:0.880000代碼下載
GitHub下載
總結
以上是生活随笔為你收集整理的Matlab搭建AlexNet实现手写数字识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: isp许可证有哪些办理常识?|信息安全|
- 下一篇: 使用代码模板