1. 程式人生 > 程式設計 >解決Alexnet訓練模型在每個epoch中準確率和loss都會一升一降問題

解決Alexnet訓練模型在每個epoch中準確率和loss都會一升一降問題

遇到的問題

解決Alexnet訓練模型在每個epoch中準確率和loss都會一升一降問題

當時自己在使用Alexnet訓練影象分類問題時,會出現損失在一個epoch中增加,換做下一個epoch時loss會驟然降低,一開始這個問題沒有一點頭緒,我資料也打亂了,使用的是tf.train.shuffle_batch

在capacity中設定一個值,比如是1000吧,每次取一千個資料後將這一千個資料打亂,本次使用的資料集就是每個種類1000多,而我載入資料時是一類一類載入的,這就造成了每一批次的開始可以跟前一類資料做打亂處理,但是在中間資料並不能達到充分的shuffle

解決問題

在載入資料集的時候用numpy中的shuffle將資料集充分的打亂後在讀入tfrecord中,之後讀取的時候使用tf.tain.shuffle_batch和使用tf.train.batch就沒有區別了。另外capacity這個數值不益設定過大,會對自己的電腦造成壓力。

補充知識:MATLAB中使用AlexNet、VGG、GoogLeNet進行遷移學習

直接貼程式碼,具體用法見註釋:

clc;clear;

net = alexnet; %載入在ImageNet上預訓練的網路模型
imageInputSize = [227 227 3];
%載入影象
allImages = imageDatastore('.\data227Alexnet',...
 'IncludeSubfolders',true,...
 'LabelSource','foldernames');
 %劃分訓練集和驗證集
 [training_set,validation_set] = splitEachLabel(allImages,0.7,'randomized');
 %由於原始網路全連線層1000個輸出,顯然不適用於我們的分類任務,因此在這裡替換
layersTransfer = net.Layers(1:end-3);
categories(training_set.Labels)
numClasses = numel(categories(training_set.Labels));
%新的網路
layers = [
 layersTransfer
 fullyConnectedLayer(numClasses,'Name','fc','WeightLearnRateFactor',1,'BiasLearnRateFactor',1)
 softmaxLayer('Name','softmax')
 classificationLayer('Name','classOutput')];

lgraph = layerGraph(layers);
plot(lgraph)
%對資料集進行擴增
augmented_training_set = augmentedImageSource(imageInputSize,training_set);

opts = trainingOptions('adam',...
 'MiniBatchSize',32,... % mini batch size,limited by GPU RAM,default 100 on Titan,500 on P6000
 'InitialLearnRate',1e-4,... % fixed learning rate
 'LearnRateSchedule','piecewise',...
 'LearnRateDropFactor',0.25,...
 'LearnRateDropPeriod',10,...
 'L2Regularization',... constraint
 'MaxEpochs',20,..
 'ExecutionEnvironment','gpu',...
 'ValidationData',validation_set,...
 'ValidationFrequency',80,...
 'ValidationPatience',8,...
 'Plots','training-progress')

net = trainNetwork(augmented_training_set,lgraph,opts);

save Alex_Public_32.mat net

[predLabels,predScores] = classify(net,validation_set);
plotconfusion(validation_set.Labels,predLabels)
PerItemAccuracy = mean(predLabels == validation_set.Labels);
title(['overall per image accuracy ',num2str(round(100*PerItemAccuracy)),'%'])

MATLAB中訓練神經網路一個非常大的優勢就是訓練過程中各項指標的視覺化,並且最終也會生成一個混淆矩陣顯示驗證集的結果。

以上這篇解決Alexnet訓練模型在每個epoch中準確率和loss都會一升一降問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。