解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题

时间:2021-05-22

遇到的问题

当时自己在使用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', 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中训练神经网络一个非常大的优势就是训练过程中各项指标的可视化,并且最终也会生成一个混淆矩阵显示验证集的结果。

以上这篇解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章