深度學習Alexnet網路對影象進行分類/預測(遷移學習)
阿新 • • 發佈:2019-02-15
眾所周知,在MATLAB裡面非常方便對各種演算法和技術進行可行性實驗,前幾個月也很好奇用深度學習對影象進行分類,幸好新版本的MATLAB 2017能夠對深度學習提供支援:D,現在抽空把程式碼分享出來與大家共享~
本文快速的用MATLAB對自己的影象資料集進行訓練和分類,小夥伴們當然也可以改成自己的試試啦~\(≧▽≦)/~,效果非常不錯,利用預訓練的alexnet網路對新影象集進行遷移學習,結果全部分類正確,達到100%的正確率~
話不多說,上程式碼和圖:
function predict_transfer_alexnet() net = alexnet;% 深度學習alexnet經典網路結構,沒有的可以去matlab center下載 trainsferLayer = net.Layers(1:end-3); imds = imageDatastore('F:\svm_images\train_images',... 'includeSubfolders',true,... 'labelsource','foldernames','ReadFcn',@IMAGERESIZE); T = countEachLabel(imds); disp(T); [imdsTrain,imdsTest] = splitEachLabel(imds,0.75);% 75%的資料為訓練資料,其餘的為測試資料 %% train layers = [trainsferLayer; fullyConnectedLayer(5,'WeightLearnRateFactor',50,'BiasLearnRateFactor',50);%注意第一個引數為類別的數量,我這裡是5 softmaxLayer(); classificationLayer()]; options = trainingOptions('sgdm',... 'Maxepochs',5,... 'InitialLearnRate',0.0001); network = trainNetwork(imdsTrain,layers,options); %% predict predictLabels = classify(network,imdsTest); testLabels = imdsTest.Labels; accuracy = sum(predictLabels == testLabels)/numel(predictLabels); disp(['accuracy:',num2str(accuracy)]); % 輸出預測精度結果 end
上面程式碼第5行函式imageDatastore是個非常有用的函式,支援大資料集的影象,而且影象類別啥的都能夠清楚的記錄;輸入引數'ReadFcn'我呼叫的是IMAGERESIZE自定義函式,主要作用是把自己的影象resize成227*227*3的,因為alexnet輸入層大小是227*227*3的,所以必須弄成這個大小。下面給出自定義的IMAGERESIZE的函式:
function output = IMAGERESIZE(input) input = imread(input); if numel(size(input)) == 2 input = cat(3,input,input,input);% 轉成3通道的 end output = imresize(input,[227,227]);