MATLAB麻雀优化CNN超参数分类

news/2025/2/7 5:27:04/

        在CNN分类器模型的构建中,涉及到特别多的超参数,比如:学习率、训练次数、batchsize、各个卷积层的卷积核大小与卷积核数量(feature map数),全连接层的节点数等。直接选择的话,很难选到一组满意的参数,因此可以用优化算法进行超参数优化,虽然过程比较慢,但是总比自己无脑试的效果好。

        基于此思想,本文采用麻雀优化算法,对CNN上述9个超参数进行优化。

1,麻雀优化算法原理

       麻雀优化是2020年提出来得,具体原理:原理点这里

2、麻雀优化CNN的原理

        一般情况下进行参数的优化的时候,就是给CNN网络设一组超参数,然后训练并验证,取验证集精度最高的那个模型(这个模型就可以认为具有最优超参数)。其实优化算法也是这样,它们都是不断地产生新的超参数组合,然后用这组超参数建立CNN网络,训练并验证。只不过,优化算法是有自己的学习规律。我们对CNN超参数进行优化,也就是让SSA一直有去找能够让验证集满足精度最大化的那一组超参数。

3、代码实现:

        数据是10分类,每个样本的特征维度是864,。共1000个样本,按照7:2:1划分训练集,验证集与测试集,标签是类比即可,不用转换为onehot编码。

        3.1 CNN分类模型

clc;clear;close all
%% read data
load('result/data_process.mat');
method=@mapstd;
% method=@mapminmax;
[xs,mapping]=method(train_X');train_X=xs';
xs=method('apply',test_X',mapping);test_X=xs';
xs=method('apply',valid_X',mapping);valid_X=xs';
N_train=size(train_X,1);
N_feature=size(train_X,2);
for i=1:N_traintrainD(:,:,:,i)=reshape(train_X(i,:),[N_feature 1 1]);
end
N_valid=size(valid_X,1);
for i=1:N_validXValidation(:,:,:,i)=reshape(valid_X(i,:),[N_feature 1 1]);
end
N_test=size(test_X,1);
for i=1:N_testtestD(:,:,:,i)=reshape(test_X(i,:),[N_feature 1 1]);
end
targetD=categorical(train_Y);YValidation=categorical(valid_Y);target_testD=categorical(test_Y);
%% define network
layers = [imageInputLayer([size(trainD,1) ,size(trainD,2), size(trainD,3)]) %convolution2dLayer(5,8,'Padding','same') % 5x5 filtr ,8 kernel padding=‘same’,stride=1(default)%     batchNormalizationLayer% batch NormalizationreluLayer % relu activation functionmaxPooling2dLayer(2,'Stride',2,'Padding','same')% 2x2 kernel stride=2,padding=1convolution2dLayer(5,16,'Padding','same') % 5x5 filtr ,16 kernel padding=‘same’,stride=1(default)%     batchNormalizationLayerreluLayer % relu activation functionmaxPooling2dLayer(2,'Stride',2,'Padding','same')% 2x2 kernel stride=2fullyConnectedLayer(128) %fc 128reluLayerfullyConnectedLayer(10) % classessoftmaxLayerclassificationLayer];options = trainingOptions('adam',...'ExecutionEnvironment','cpu', ...'MaxEpochs',10, ...'InitialLearnRate',1e-3, ...'MiniBatchSize',16, ...'shuffle','every-epoch',...'Verbose',false);
% analyzeNetwork(layers)
%% train
train_again=1;% 为1就代码重新训练模型,为0就是调用训练好的网络
if train_again==1[net,traininfo] = trainNetwork(trainD,targetD,layers,options);save result/cnn_net net traininfo
elseload result/cnn_net
endfigure;
yyaxis left; % 激活左边的轴
plot(traininfo.TrainingLoss);
title('CNN');
xlabel('训练次数');
ylabel('损失值'); % 给左y轴添加轴标签
yyaxis right; % 激活右边的轴
plot(traininfo.TrainingAccuracy);
ylabel('正确率'); % 给右y轴添加轴标签
%% test
predictedLabels = classify(net,testD);
save result/cnn_result target_testD predictedLabelsdisp('测试集分类正确率为:')
acc=sum(target_testD==predictedLabels)/length(target_testD)
图1 CNN结果

         上面是CNN的损失曲线与正确率曲线,下面是测试集输入训练好的网络得到的正确率,为85%。 

        3.2 SSA优化CNN分类模型

clc;clear;close all;format compact;rng(0)
%% 数据处理
load('result/data_process.mat');
method=@mapstd;
% method=@mapminmax;
[xs,mapping]=method(train_X');train_X=xs';
xs=method('apply',test_X',mapping);test_X=xs';
xs=method('apply',valid_X',mapping);valid_X=xs';
N_train=size(train_X,1);
N_feature=size(train_X,2);
for i=1:N_traintrainD(:,:,:,i)=reshape(train_X(i,:),[N_feature 1 1]);
end
N_valid=size(valid_X,1);
for i=1:N_validXValidation(:,:,:,i)=reshape(valid_X(i,:),[N_feature 1 1]);
end
N_test=size(test_X,1);
for i=1:N_testtestD(:,:,:,i)=reshape(test_X(i,:),[N_feature 1 1]);
endtargetD=categorical(train_Y);YValidation=categorical(valid_Y);target_testD=categorical(test_Y);%% SSA优化CNN的超参数
%一共有9个参数需要优化,分别是学习率、迭代次数、batchsize、第一层卷积层的核大小、和数量、第2层卷积层的核大小、和数量,以及两个全连接层的神经元数量
optimize=1;%optimize为1就优化 不然就调用之前优化得到的参数直接训练测试
if optimize==1[x,trace]=ssa_cnn(trainD,targetD,XValidation,YValidation);save result/ssa_result x trace
elseload result/ssa_result
end
figure
plot(trace)
title('适应度曲线')
xlabel('优化次数')
ylabel('适应度值')disp('优化后的各超参数')
lr=x(1)%学习率
iter=x(2)%迭代次数
minibatch=x(3)%batchsize
kernel1_size=x(4)
kernel1_num=x(5)%第一层卷积层的核大小
kernel2_size=x(6)
kernel2_num=x(7)%第2层卷积层的核大小
fc1_num=x(8)
fc2_num=x(9)%两个全连接层的神经元数量%% 利用寻优得到参数重新训练CNN与预测
rng(0)
layers = [imageInputLayer([size(trainD,1) ,size(trainD,2), size(trainD,3)])convolution2dLayer(kernel1_size,kernel1_num,'Stride',1,'Padding','same')%     batchNormalizationLayerreluLayermaxPooling2dLayer(2,'Stride',2,'Padding','same')% 2x2 kernel stride=2,padding=1convolution2dLayer(kernel2_size,kernel2_num,'Stride',1,'Padding','same')%     batchNormalizationLayerreluLayermaxPooling2dLayer(2,'Stride',2,'Padding','same')% 2x2 kernel stride=2,padding=1fullyConnectedLayer(fc1_num)reluLayerfullyConnectedLayer(fc2_num)reluLayerfullyConnectedLayer(10)softmaxLayerclassificationLayer];
options = trainingOptions('adam', ...'ExecutionEnvironment','cpu', ...'MaxEpochs',iter, ...'MiniBatchSize',minibatch, ...'InitialLearnRate',lr, ...'GradientThreshold',1, ...'shuffle','every-epoch',...'Verbose',false);
%%
train_again=1;% 为1就代码重新训练模型,为0就是调用训练好的网络
if train_again==1[net,traininfo] = trainNetwork(trainD,targetD,layers,options);save result/ssacnn_net net traininfo
elseload result/ssacnn_net
endfigure;
yyaxis left; % 激活左边的轴
plot(traininfo.TrainingLoss);
title('SSA-CNN');
xlabel('训练次数');
ylabel('损失值'); % 给左y轴添加轴标签
yyaxis right; % 激活右边的轴
plot(traininfo.TrainingAccuracy);
ylabel('正确率'); % 给右y轴添加轴标签
%%
predictedLabels = classify(net,testD);
save result/ssa_cnn_result target_testD predictedLabelsdisp('测试集分类正确率为:')
acc=sum(target_testD==predictedLabels)/length(target_testD)

        以最小化验证集分类错误率为适应度函数,目的就是找到一组超参数,使得网络错误率最低。所以适应度曲线是一条下降的曲线

利用上述最优参数,训练CNN,结果如下:

可以看到测试集正确率为94%,具有明显提升。 

4.代码

代码见评论区,还有更多哦

1.MATLAB麻雀优化CNN超参数分类

2.MATLAB麻雀优化CNN超参数回归


http://www.ppmy.cn/news/239555.html

相关文章

神经网络模型计算量 参数量 解释

1. 概念 计算量(FLOPs)对应我们之前的时间复杂度,计算量要看网络执行时间的长短 PS: FLOPS:全大写,意指每秒浮点运算次数,理解为计算速度,是一个衡量硬件性能的指标。 FLOPs:s小写&#xff0…

R语言参数估计笔记及例题

R语言参数估计 目录 R语言参数估计 1.R语言点估计 1.1定义 1.2 例题 2.R语言正态总体均值区间评估 2.1定义 2.2方差已知时,求置信区间 2.2.1自定义函数 2.2.2例题 2.3方差未知时,求置信区间 2.3.1调用内置函数t.test() 2.3.2例题 3.R语言单…

Libsvm网格参数寻优教程

原文:http://endual.iteye.com/blog/1262010 首先下载Libsvm、Python和Gnuplot: l libsvm的主页http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下载libsvm (我自己用2.86版本) l python的主页http://www.python…

SVM模型应用(四)SVM模型的超参数选择

SVM模型超参数优化目前常用的方法是让C和g在一定的范围内取值,对于取定的c和g,把训练集作为原始数据集利用K-CV方法得到在此对c和g组合下验证集的分类准确率,最终取得训练集验证分类准确率最高的那组c和g作为最佳参数。对于可能会有多组的c和…

yolov4训练网络配置及参数配置

1、网络模型 主要修改classes和其上一层网络层输出(classes5)*3->(classes[xmin,ymin,xmax,ymax,c])*Scalar lr_rate和max_batches自行配置,建议初始学习率设置为0.001,max_batchesclasses*2000 [net] # Testing #batch1 #s…

Highcharts的选项配置参数

Chart:图表区选项 Chart图表区选项用于设置图表区相关属性。 参数描述默认值backgroundColor设置图表区背景色#FFFFFFborderWidth设置图表边框宽度0borderRadius设置图表边框圆角角度5renderTo图表放置的容器,一般在html中放置一个DIV,获取D…

非参数统计检验

非参数统计的方法用于总体分布未知的情形,其目的在于检验一个变量的分布在不同组中是否具有相同的位置参数。 NPAR1WAY语句 功能 格式: proc npar1way data数据集名 [选项]; by 变量名; class 变量名; var 变量名; run;注: proc的选项&am…

相机内参数和外参数

求解相机内参:相机标定 求解相机外参:相机位姿估计 相机内参数是与相机自身特性相关的参数,比如相机的焦距、像素大小等; 相机外参数是在世界坐标系中的参数,比如相机的位置、旋转方向等。 相机标定(或摄…