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

當時自己在使用Alexnet訓練圖像分類問題時,會出現(xiàn)損失在一個epoch中增加,換做下一個epoch時loss會驟然降低,一開始這個問題沒有一點頭緒,我數(shù)據(jù)也打亂了,使用的是tf.train.shuffle_batch
在capacity中設(shè)置一個值,比如是1000吧,每次取一千個數(shù)據(jù)后將這一千個數(shù)據(jù)打亂,本次使用的數(shù)據(jù)集就是每個種類1000多,而我加載數(shù)據(jù)時是一類一類加載的,這就造成了每一批次的開始可以跟前一類數(shù)據(jù)做打亂處理,但是在中間數(shù)據(jù)并不能達到充分的shuffle
解決問題
在加載數(shù)據(jù)集的時候用numpy中的shuffle將數(shù)據(jù)集充分的打亂后在讀入tfrecord中,之后讀取的時候使用tf.tain.shuffle_batch和使用tf.train.batch就沒有區(qū)別了。另外capacity這個數(shù)值不益設(shè)置過大,會對自己的電腦造成壓力。
補充知識:MATLAB中使用AlexNet、VGG、GoogLeNet進行遷移學習
直接貼代碼,具體用法見注釋:
clc;clear;
net = alexnet; %加載在ImageNet上預訓練的網(wǎng)絡(luò)模型
imageInputSize = [227 227 3];
%加載圖像
allImages = imageDatastore('.\data227Alexnet',...
'IncludeSubfolders',true,...
'LabelSource','foldernames');
%劃分訓練集和驗證集
[training_set,validation_set] = splitEachLabel(allImages,0.7,'randomized');
%由于原始網(wǎng)絡(luò)全連接層1000個輸出,顯然不適用于我們的分類任務(wù),因此在這里替換
layersTransfer = net.Layers(1:end-3);
categories(training_set.Labels)
numClasses = numel(categories(training_set.Labels));
%新的網(wǎng)絡(luò)
layers = [
layersTransfer
fullyConnectedLayer(numClasses,'Name', 'fc','WeightLearnRateFactor',1,'BiasLearnRateFactor',1)
softmaxLayer('Name', 'softmax')
classificationLayer('Name', 'classOutput')];
lgraph = layerGraph(layers);
plot(lgraph)
%對數(shù)據(jù)集進行擴增
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', 1e-4,... 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中訓練神經(jīng)網(wǎng)絡(luò)一個非常大的優(yōu)勢就是訓練過程中各項指標的可視化,并且最終也會生成一個混淆矩陣顯示驗證集的結(jié)果。
以上這篇解決Alexnet訓練模型在每個epoch中準確率和loss都會一升一降問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
pycharm中選中一個單詞替換所有重復單詞的實現(xiàn)方法
這篇文章主要介紹了pycharm中選中一個單詞替換所有重復單詞的實現(xiàn)方法,類似于sublime 里的ctrl+D功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-11-11
python標準庫sys和OS的函數(shù)使用方法與實例詳解
這篇文章主要介紹了python標準庫sys和OS的函數(shù)使用方法與實例詳解,需要的朋友可以參考下2020-02-02
python str()如何將參數(shù)轉(zhuǎn)換為字符串類型
這篇文章主要介紹了python str()如何將參數(shù)轉(zhuǎn)換為字符串類型的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

