解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
时间:2022-07-27
本文章向大家介绍解决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', 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都会一升一降问题就是小编分享给大家的全部内容了,希望能给大家一个参考。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- React Ref 使用总结
- Python人脸识别—我的眼里只有你
- 函数式编程是如何提升代码的扩展性
- 浏览器中的跨域问题与 CORS
- 微信小程序怎么做链接可以链到小程序的其它页面。
- 如何实现一个 3D 效果的魔方
- FlutterDojo设计之道—状态管理之路(三)
- 微信头像加国旗
- FlutterDojo设计之道—状态管理之路(四)
- FlutterDojo设计之道—状态管理之路(五)
- Python高级进阶(一)Python框架之Django入门
- python 自动化测试(2):针对密码输入框为密码控件时的解决方案
- 微信小程序开发之视图容器swiper
- WINDOWS服务器同时安装多个版本的MYSQL的方法,MQYSQL5和MQYSQL8的共存。
- 使用PHP对接国外的PAYPAL支付最新REST API接口。