Sparrow 回帰用の CNN ハイパーパラメーターの最適化 MATLAB

         CNN モデルの構築には、学習率、トレーニング回数、バッチサイズ、各畳み込み層の畳み込みカーネル サイズと畳み込みカーネルの数 (特徴マップの数)、ノードなどの多数のハイパーパラメータが関係します。完全に接続された層の数など。直接選択すると、満足のいくパラメータのセットを選択することが困難になるため、ハイパーパラメータの最適化には最適化アルゴリズムが使用されます。複数の試行と比較して、最適化アルゴリズムは最適化選択のための独自の戦略セットに従います。

        この考えに基づいて、この論文では、スパロー最適化アルゴリズムを使用して、CNN の上記 9 つのハイパーパラメータを最適化します。

1. Sparrow 最適化アルゴリズムの原理

       Sparrow 最適化は 2020 年に提案されました。その具体的な原理:原理についてはここをクリックしてください

2. Sparrow 最適化の原理 CNN

        一般に、パラメーターを最適化する場合は、CNN ネットワークに一連のハイパーパラメーターを設定し、トレーニングと検証を行って、検証セットの中で最も精度の高いモデルを採用します (このモデルは最適なハイパーパラメーターを備えていると考えることができます)。実際、最適化アルゴリズムも同様で、常に新しいハイパーパラメータの組み合わせを生成し、このハイパーパラメータのセットを使用して CNN ネットワークを構築し、トレーニングし、検証します。ただし、最適化アルゴリズムには独自の学習ルールがあります。CNN ハイパーパラメータを最適化します。つまり、SSA が検証セットの精度を最大化できるハイパーパラメータのセットを常に見つけられるようにします。

3. コードの実装:

        データは複数の入力と単一の出力を採用しています。私の Excel シートでは、最後の列が出力され、最初の数列が入力されています。もちろん、複数の出力形式に変更して、独自の入力と出力を作成することもできます正しく。

        3.1 CNNモデル

clc;clear;close all;rng(0)
%% 数据的提取
data=xlsread('data.xlsx');
input=data(:,1:end-1);%x
output=data(:,end);%y

%% 数据处理
n=randperm(size(input,1));
m=round(size(input,1)*0.7);%随机70%作为训练集 其余30%作为测试集
train_x=input(n(1:m),:);
train_y=output(n(1:m),:);
test_x=input(n(m+1:end),:);
test_y=output(n(m+1:end),:);

% 归一化或者标准化
method=@mapminmax;
% method=@mapstd;
[train_x,train_ps]=method(train_x');
test_x=method('apply',test_x',train_ps);
[train_y,output_ps]=method(train_y');
test_y=method('apply',test_y',output_ps);

feature=size(train_x,1);
num_train=size(train_x,2);
num_test=size(test_x,2);
trainD=reshape(train_x,[feature,1,1,num_train]);
testD=reshape(test_x,[feature,1,1,num_test]);
targetD = train_y';
targetD_test  = test_y';

%% 
layers = [
    imageInputLayer([size(trainD,1) size(trainD,2) size(trainD,3)]) % 输入
    convolution2dLayer(3,4,'Stride',1,'Padding','same')%核3*1 数量4 步长1 填充为same
    reluLayer%relu激活
    convolution2dLayer(3,8,'Stride',1,'Padding','same')%核3*1 数量8 步长1 填充为same
    reluLayer%relu激活
    fullyConnectedLayer(20) % 全连接层1 20个神经元
    reluLayer
    fullyConnectedLayer(20) % 全连接层2 20个神经元
    reluLayer
    fullyConnectedLayer(size(targetD,2)) %输出层
    regressionLayer];
options = trainingOptions('adam', ...
    'ExecutionEnvironment','cpu', ...
    'MaxEpochs',30, ...
    'MiniBatchSize',16, ...
    'InitialLearnRate',0.01, ...
    '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/cnn_net net traininfo
else
    load result/cnn_net
end
figure;
plot(traininfo.TrainingLoss,'b')
hold on;grid on
ylabel('损失')
xlabel('训练次数')
title('CNN')


%% 结果评价
YPred = predict(net,testD);YPred=double(YPred);

% 反归一化
predict_value=method('reverse',YPred',output_ps);predict_value=double(predict_value);
true_value=method('reverse',targetD_test',output_ps);true_value=double(true_value);

save result/cnn_result predict_value true_value
%%
figure
plot(true_value,'-*','linewidth',3)
hold on
plot(predict_value,'-s','linewidth',3)
legend('实际值','预测值')
title('CNN')
grid on

result(true_value,predict_value)

損失曲線とテストセットの結果を図に示します。

 結果は次のとおりです。 

R 二乗決定係数 (R2): 0.79945
平均相対誤差 (MPE): 0.20031
平均絶対パーセント誤差 (MAPE): 20.0306%
平均絶対誤差 (MAE): 0.32544
二乗平均平方根誤差 (RMSE): 0.47113

        3.2 SSA に最適化された CNN

clc;clear;close all;format compact;rng(0)

%% 数据的提取
data=xlsread('data.xlsx');
input=data(:,1:end-1);%x
output=data(:,end);%y
%% 数据处理
n=randperm(size(input,1));
m=round(size(input,1)*0.7);%随机70%作为训练集 其余30%作为测试集
train_x=input(n(1:m),:);
train_y=output(n(1:m),:);
test_x=input(n(m+1:end),:);
test_y=output(n(m+1:end),:);

% 归一化或者标准化
method=@mapminmax;
% method=@mapstd;
[train_x,train_ps]=method(train_x');
test_x=method('apply',test_x',train_ps);
[train_y,output_ps]=method(train_y');
test_y=method('apply',test_y',output_ps);

feature=size(train_x,1);
num_train=size(train_x,2);
num_test=size(test_x,2);
trainD=reshape(train_x,[feature,1,1,num_train]);
testD=reshape(test_x,[feature,1,1,num_test]);
targetD = train_y';
targetD_test  = test_y';


%% SSA优化CNN的超参数
%一共有9个参数需要优化,分别是学习率、迭代次数、batchsize、第一层卷积层的核大小、和数量、第2层卷积层的核大小、和数量,以及两个全连接层的神经元数量
optimaztion=1;  
if optimaztion==1
    [x,trace]=ssa_cnn(trainD,targetD,testD,targetD_test);
    save result/ssa_result x trace
else
    load 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')
    reluLayer
    convolution2dLayer(kernel2_size,kernel2_num,'Stride',1,'Padding','same')
    reluLayer
    fullyConnectedLayer(fc1_num)
    reluLayer
    fullyConnectedLayer(fc2_num)
    reluLayer
    fullyConnectedLayer(size(targetD,2))
    regressionLayer];
options = trainingOptions('adam', ...
    'ExecutionEnvironment','cpu', ...
    'MaxEpochs',iter, ...
    'MiniBatchSize',minibatch, ...
    'InitialLearnRate',lr, ...
    'GradientThreshold',1, ...
    'Verbose',false);

train_again=1;% 为1就重新训练模型,为0就是调用训练好的网络  load options_data1600.mat  ,changed!must retrain   train_again=0;% 为1就重新训练模型,为0就是调用训练好的网络
if train_again==1
    [net,traininfo] = trainNetwork(trainD,targetD,layers,options);
    save result/ssacnn_net net traininfo
else
    load result/ssacnn_net
end

figure;
plot(traininfo.TrainingLoss,'b')
hold on;grid on
ylabel('损失')
xlabel('训练次数')
title('SSA-CNN')


%% 结果评价
YPred = predict(net,testD);YPred=double(YPred);

% 反归一化
predict_value=method('reverse',YPred',output_ps);predict_value=double(predict_value);
true_value=method('reverse',targetD_test',output_ps);true_value=double(true_value);

save result/ssa_cnn_result predict_value true_value
%%
figure
plot(true_value,'-*','linewidth',3)
hold on
plot(predict_value,'-s','linewidth',3)
legend('实际值','预测值')
title('SSA-CNN')
grid on

result(true_value,predict_value)


        適応度関数は、テスト セットの真の値と予測値の間の平均二乗誤差を最小化することであり、目的は、ネットワークの平均二乗誤差が最小になるようにハイパーパラメーターのセットを見つけることです。つまり、フィットネスカーブは下降曲線です

 

結果は次のとおりです。

R 二乗決定係数 (R2): 0.86547
平均相対誤差 (MPE): 0.114
平均絶対パーセント誤差 (MAPE): 11.3997%
平均絶対誤差 (MAE): 0.17238
二乗平均平方根誤差 (RMSE): 0.26745

テスト セットの指標が大幅に改善されていることがわかります。 

4. コード

コメント領域のコードなどを参照してください。

1. MATLAB sparrow は CNN ハイパーパラメーター回帰を最適化します

2. MATLAB ハイイロオオカミは CNN ハイパーパラメーター回帰を最適化します

3.MATLAB whale は CNN ハイパーパラメーター回帰を最適化します

4. MATLAB sparrow は CNN ハイパーパラメーター分類を最適化します

おすすめ

転載: blog.csdn.net/qq_41043389/article/details/127539127
おすすめ