1. 程式人生 > >深度學習Alexnet網路對影象進行分類/預測(遷移學習)

深度學習Alexnet網路對影象進行分類/預測(遷移學習)

眾所周知,在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]);