Matlab搭建AlexNet實(shí)現(xiàn)手寫(xiě)數(shù)字識(shí)別
個(gè)人博客地址
環(huán)境
- Matlab 2020a
- Windows10
內(nèi)容
使用Matlab對(duì)MNIST數(shù)據(jù)集進(jìn)行預(yù)處理,搭建卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,實(shí)現(xiàn)識(shí)別手寫(xiě)數(shù)字的任務(wù)。在訓(xùn)練過(guò)程中,每隔30個(gè)batch輸出一次模型在驗(yàn)證集上的準(zhǔn)確率和損失值。在訓(xùn)練結(jié)束后會(huì)輸出驗(yàn)證集中每個(gè)數(shù)字的真實(shí)值、網(wǎng)絡(luò)預(yù)測(cè)值和判定概率,并給出總的識(shí)別準(zhǔn)確率。
步驟
準(zhǔn)備MNIST數(shù)據(jù)集
為了方便進(jìn)行測(cè)試,本次只選用500張MNIST數(shù)據(jù)集,每個(gè)數(shù)字50張。
下載數(shù)據(jù)集后并解壓,為每個(gè)數(shù)字創(chuàng)建單獨(dú)文件夾并將該數(shù)字的所有圖片放在對(duì)應(yīng)的文件夾下,如圖1所示。
數(shù)據(jù)集下載地址 提取碼:af6n
手動(dòng)分類(lèi)結(jié)束后每個(gè)文件夾中應(yīng)有50張圖片。
數(shù)據(jù)預(yù)處理
% 加載數(shù)據(jù)集
imds = imageDatastore(...
"./data",...
'IncludeSubfolders', true,...
'LabelSource','foldernames');
使用imageDatastore
加載數(shù)據(jù)集。第一個(gè)參數(shù)填寫(xiě)數(shù)據(jù)集路徑。由于本次實(shí)驗(yàn)data目錄下含有子文件夾所以IncludeSubfolders
需要指定為true。LabelSource
表示標(biāo)簽來(lái)源,這里使用文件夾名字來(lái)代表標(biāo)簽。
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: 1
SupportedOutputFormats: [1×5 string]
DefaultOutputFormat: "png"
ReadFcn: @readDatastoreImage
上面內(nèi)容為執(zhí)行imageDatastore后返回變量的屬性??梢钥闯鲆呀?jīng)成功將數(shù)據(jù)集讀入并對(duì)每張圖片進(jìn)行l(wèi)abel處理。
由于每個(gè)數(shù)字有50張圖像,因此本次實(shí)驗(yàn)每個(gè)數(shù)字選用30張進(jìn)行訓(xùn)練,另20張進(jìn)行驗(yàn)證。使用splitEachLabel進(jìn)行劃分,得到訓(xùn)練集和驗(yàn)證集。
% 數(shù)據(jù)打亂
imds = shuffle(imds);
% 劃分訓(xùn)練集和驗(yàn)證集。每一個(gè)類(lèi)別訓(xùn)練集有30個(gè),驗(yàn)證集有20個(gè)
[imdsTrain,imdsValidation] = splitEachLabel(imds, 30);
使用shuffle進(jìn)行數(shù)據(jù)打亂。得到的imdsTrain和imdsValidation分別有300和200張圖片。
% 將訓(xùn)練集與驗(yàn)證集中圖像的大小調(diào)整成與輸入層的大小相同
augimdsTrain = augmentedImageDatastore([28 28],imdsTrain);
augimdsValidation = augmentedImageDatastore([28 28],imdsValidation);
定義網(wǎng)絡(luò)模型
% 構(gòu)建alexnet卷積網(wǎng)絡(luò)
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') % 將新的全連接層的輸出設(shè)置為訓(xùn)練數(shù)據(jù)中的種類(lèi)
softmaxLayer('Name', 'Softmax') % 添加新的Softmax層
classificationLayer('Name', 'Output') ]; % 添加新的分類(lèi)層
使用上面的代碼即可構(gòu)建AlexNet模型。
% 對(duì)構(gòu)建的網(wǎng)絡(luò)進(jìn)行可視化分析
lgraph = layerGraph(mynet);
analyzeNetwork(lgraph)
定義訓(xùn)練超參數(shù)
% 配置訓(xùn)練選項(xiàng)
options = trainingOptions('sgdm', ...
'InitialLearnRate',0.001, ...
'MaxEpochs',100, ...
'Shuffle','every-epoch', ...
'ValidationData',augimdsValidation, ...
'ValidationFrequency',30, ...
'Verbose',true, ...
'Plots','training-progress');
本次實(shí)驗(yàn)選用sgdm作為優(yōu)化器,初始學(xué)習(xí)率設(shè)置為0.001,最大迭代次數(shù)為100,每次迭代都會(huì)打亂數(shù)據(jù),每隔30個(gè)batch進(jìn)行一次驗(yàn)證。
網(wǎng)絡(luò)訓(xùn)練和預(yù)測(cè)
% 對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練
net = trainNetwork(augimdsTrain, mynet, options);
% 將訓(xùn)練好的網(wǎng)絡(luò)用于對(duì)新的輸入圖像進(jìn)行分類(lèi),得到預(yù)測(cè)結(jié)果和判定概率
[YPred, err] = classify(net, augimdsValidation);
其中,YPred是存放網(wǎng)絡(luò)對(duì)驗(yàn)證集預(yù)測(cè)結(jié)果的數(shù)組,err存放著每個(gè)數(shù)字的判定概率。
% 打印真實(shí)數(shù)字、預(yù)測(cè)數(shù)字、判定概率和準(zhǔn)確率
YValidation = imdsValidation.Labels;
for i=1:200
fprintf("真實(shí)數(shù)字:%d 預(yù)測(cè)數(shù)字:%d", double(YValidation(i,1))-1, double(YPred(i, 1))-1);
fprintf(" 判定概率:%f\n", max(err(i, :)));
end
運(yùn)行上面代碼即可打印相關(guān)結(jié)果。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-454809.html
... ...
真實(shí)數(shù)字:4 預(yù)測(cè)數(shù)字:4 判定概率:0.814434
真實(shí)數(shù)字:0 預(yù)測(cè)數(shù)字:0 判定概率:0.657829
真實(shí)數(shù)字:8 預(yù)測(cè)數(shù)字:8 判定概率:0.874560
真實(shí)數(shù)字:0 預(yù)測(cè)數(shù)字:0 判定概率:0.988826
真實(shí)數(shù)字:6 預(yù)測(cè)數(shù)字:6 判定概率:0.970034
... ...
真實(shí)數(shù)字:5 預(yù)測(cè)數(shù)字:5 判定概率:0.806220
真實(shí)數(shù)字:4 預(yù)測(cè)數(shù)字:4 判定概率:0.938233
真實(shí)數(shù)字:7 預(yù)測(cè)數(shù)字:7 判定概率:0.906994
真實(shí)數(shù)字:7 預(yù)測(cè)數(shù)字:7 判定概率:0.837794
真實(shí)數(shù)字:6 預(yù)測(cè)數(shù)字:6 判定概率:0.951572
真實(shí)數(shù)字:6 預(yù)測(cè)數(shù)字:1 判定概率:0.415834
真實(shí)數(shù)字:5 預(yù)測(cè)數(shù)字:5 判定概率:0.789031
真實(shí)數(shù)字:2 預(yù)測(cè)數(shù)字:2 判定概率:0.363526
真實(shí)數(shù)字:7 預(yù)測(cè)數(shù)字:7 判定概率:0.930049
準(zhǔn)確率:0.880000
代碼下載
GitHub下載文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-454809.html
到了這里,關(guān)于Matlab搭建AlexNet實(shí)現(xiàn)手寫(xiě)數(shù)字識(shí)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!