使用Alexnet進(jìn)行遷移學(xué)習(xí)(MATLAB)

前言:
? ? ? ?本文基于預(yù)訓(xùn)練的卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)進(jìn)行模型創(chuàng)建,進(jìn)行調(diào)整后應(yīng)用到已有的數(shù)據(jù)集電熔鎂砂(Fused magnesium furnace, FMF)工況識(shí)別(實(shí)驗(yàn)室數(shù)據(jù)集,不公開)。
正文:
? ? ? 這里不對(duì)數(shù)據(jù)集背景展開介紹,為了方便說(shuō)明,視FMF數(shù)據(jù)集為一個(gè)故障識(shí)別問(wèn)題,故障工況的標(biāo)簽為1,非故障工況的標(biāo)簽為0。FMF數(shù)據(jù)集樣本來(lái)自于實(shí)際電熔鎂爐同一批爐次工況運(yùn)行的片段,后期經(jīng)過(guò)圖像增強(qiáng)處理,圖像大小為32X32X3的RGB圖像。其中使用訓(xùn)練集traindata2.mat包含3010張圖像,故障數(shù)與非故障數(shù)比例為1923:1087;使用測(cè)試集testdata4.mat包含626張圖像,故障數(shù)與非故障數(shù)比例為416:210。
實(shí)驗(yàn)環(huán)境使用MATLAB 2022b的深度學(xué)習(xí)工具箱以及附加功能資源。
建議先安裝好附加資源管理器的AlexNet


修改全連接層

非常失敗的一次嘗試,為了適應(yīng)Alexnet網(wǎng)絡(luò)輸入,調(diào)整圖片輸入為227*227*3,訓(xùn)練結(jié)果只有91%的準(zhǔn)確率,在測(cè)試集上效果不理想
%% Alexnet遷移學(xué)習(xí)
%% 清空環(huán)境和圖窗
clear
close all
%% 導(dǎo)入模型
net = alexnet;
layers = net.Layers
layers(end-2) = fullyConnectedLayer(2); ?%故障識(shí)別為二分類
layers(end) = classificationLayer;
%% 準(zhǔn)備數(shù)據(jù)集
load("traindata2.mat")
len = length(label);
img(:,:,:,len) = zeros(227,227,3); %預(yù)分配內(nèi)存
for i ?= 1:len
? ?img(:,:,:,i) = imresize(video(:,:,:,i),[227 227]); %調(diào)整輸入大小為227*227*3
end
rng(10) ? % 設(shè)置seed,便于復(fù)現(xiàn)
randIndex = randperm(len);
len1 = round(0.7*len);
trainIndex = randIndex(1:len1);
testIndex = randIndex(len1+1:end);
trainlabels = label(trainIndex);
trainImages = img(:,:,:,trainIndex);
vallabels = label(testIndex);
valImages = img(:,:,:,testIndex);
trainlabels = categorical(trainlabels);
vallabels = categorical(vallabels);
%% 模型訓(xùn)練
options = trainingOptions('adam',...
? ?'ExecutionEnvironment','gpu',...
? ?'InitialLearnRate',0.01,...
? ?'MiniBatchSize',128,...
? ?'MaxEpochs',100,...
? ?'Shuffle','every-epoch',...
? ?'ValidationData',{valImages,vallabels},...
? ?'ValidationFrequency',50,...
? ?'Verbose',false,...
? ?'Plots','training-progress');
net = trainNetwork(trainImages,trainlabels,layers,options);

%% 測(cè)試集驗(yàn)證
load('testdata4_label.mat')
testlabels = categorical(label);
len1 = length(testlabels);
img1(:,:,:,len1) = zeros(227,227,3);
for i = 1:len1
? ?img1(:,:,:,i) = imresize(video(:,:,:,i),[227 227]);
end
pred_labels = classify(net,img1);
test_Acc = sum(pred_labels == testlabels')/len1
cm = confusionchart(testlabels',pred_labels); %推薦使用
cm.ColumnSummary = 'column-normalized';
cm.RowSummary = 'row-normalized';
cm.Title = 'SAPI-FMF Confusion Matrix';


對(duì)比實(shí)驗(yàn),使用自定義的CNN,網(wǎng)絡(luò)結(jié)構(gòu)更簡(jiǎn)單,不對(duì)原始輸入進(jìn)行調(diào)整

%% 清空變量和圖窗
clear;
close all;
%% 導(dǎo)入數(shù)據(jù)集
load("traindata2.mat")
len = length(label); ?
rng(10) ? % 設(shè)置seed,便于復(fù)現(xiàn)
randIndex = randperm(len);
len1 = round(0.7*len);
trainIndex = randIndex(1:len1);
testIndex = randIndex(len1+1:end);
trainlabels = label(trainIndex);
trainImages = video(:,:,:,trainIndex);
vallabels = label(testIndex);
valImages = video(:,:,:,testIndex);
trainlabels = categorical(trainlabels);
vallabels = categorical(vallabels);
%% 定義神經(jīng)網(wǎng)絡(luò)
layers = [
? ? imageInputLayer([32,32,3])
? ? convolution2dLayer(5,32,'Padding','same')
? ? maxPooling2dLayer(2,"Stride",2,"Padding","same")
? ? dropoutLayer(0.3)
? ? convolution2dLayer(3,32)
? ? batchNormalizationLayer
? ? reluLayer
? ? maxPooling2dLayer(2,'Stride',2)
? ? fullyConnectedLayer(2)
? ? softmaxLayer
? ? classificationLayer
];
options = trainingOptions('adam',...
? ?'ExecutionEnvironment','multi-gpu',...
? ?'InitialLearnRate',0.01,...
? ?'MiniBatchSize',128,...
? ?'MaxEpochs',100,...
? ?'Shuffle','every-epoch',...
? ?'ValidationData',{valImages,vallabels},...
? ?'ValidationFrequency',50,...
? ?'Verbose',false,...
? ?'Plots','training-progress');

net = trainNetwork(trainImages,trainlabels,layers,options);
%% 測(cè)試集驗(yàn)證
load('testdata4_label.mat')
testlabels = categorical(label);
testImages = video;
len2 = length(testlabels);
pred_labels = classify(net,testImages);
test_Acc = sum(pred_labels == testlabels')/len2
cm = confusionchart(testlabels',pred_labels); %推薦使用
cm.ColumnSummary = 'column-normalized';
cm.RowSummary = 'row-normalized';
cm.Title = 'SAPI-FMF Confusion Matrix';
cm.RowSummary = 'row-normalized';
cm.Title = 'SAPI-FMF Confusion Matrix';

? 針對(duì)二維卷積神經(jīng)網(wǎng)絡(luò)的模型,訓(xùn)練效果均不太理想,同時(shí)由于所選數(shù)據(jù)集分布不合理,訓(xùn)練的模型傾向于無(wú)故障的分類(實(shí)際的數(shù)據(jù)集比所選數(shù)據(jù)集要多),模型準(zhǔn)確性和泛化能力更差;另一方面,模型參數(shù)和優(yōu)化參數(shù)沒(méi)有充分調(diào)整。本文借助于MATLAB進(jìn)行初步的驗(yàn)證和嘗試,后面會(huì)使用基于python的深度學(xué)習(xí)框架pytorch或者Tensorflow進(jìn)行模型的搭建和訓(xùn)練。