当前位置:   article > 正文

MATLAB麻雀优化CNN超参数分类_为什么用优化算法优化cnn

为什么用优化算法优化cnn

        在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分类模型

  1. clc;clear;close all
  2. %% read data
  3. load('result/data_process.mat');
  4. method=@mapstd;
  5. % method=@mapminmax;
  6. [xs,mapping]=method(train_X');train_X=xs';
  7. xs=method('apply',test_X',mapping);test_X=xs';
  8. xs=method('apply',valid_X',mapping);valid_X=xs';
  9. N_train=size(train_X,1);
  10. N_feature=size(train_X,2);
  11. for i=1:N_train
  12. trainD(:,:,:,i)=reshape(train_X(i,:),[N_feature 1 1]);
  13. end
  14. N_valid=size(valid_X,1);
  15. for i=1:N_valid
  16. XValidation(:,:,:,i)=reshape(valid_X(i,:),[N_feature 1 1]);
  17. end
  18. N_test=size(test_X,1);
  19. for i=1:N_test
  20. testD(:,:,:,i)=reshape(test_X(i,:),[N_feature 1 1]);
  21. end
  22. targetD=categorical(train_Y);
  23. YValidation=categorical(valid_Y);
  24. target_testD=categorical(test_Y);
  25. %% define network
  26. layers = [
  27. imageInputLayer([size(trainD,1) ,size(trainD,2), size(trainD,3)]) %
  28. convolution2dLayer(5,8,'Padding','same') % 5x5 filtr ,8 kernel padding=same’,stride=1default
  29. % batchNormalizationLayer% batch Normalization
  30. reluLayer % relu activation function
  31. maxPooling2dLayer(2,'Stride',2,'Padding','same')% 2x2 kernel stride=2,padding=1
  32. convolution2dLayer(5,16,'Padding','same') % 5x5 filtr ,16 kernel padding=same’,stride=1default
  33. % batchNormalizationLayer
  34. reluLayer % relu activation function
  35. maxPooling2dLayer(2,'Stride',2,'Padding','same')% 2x2 kernel stride=2
  36. fullyConnectedLayer(128) %fc 128
  37. reluLayer
  38. fullyConnectedLayer(10) % classes
  39. softmaxLayer
  40. classificationLayer];
  41. options = trainingOptions('adam',...
  42. 'ExecutionEnvironment','cpu', ...
  43. 'MaxEpochs',10, ...
  44. 'InitialLearnRate',1e-3, ...
  45. 'MiniBatchSize',16, ...
  46. 'shuffle','every-epoch',...
  47. 'Verbose',false);
  48. % analyzeNetwork(layers)
  49. %% train
  50. train_again=1;% 为1就代码重新训练模型,为0就是调用训练好的网络
  51. if train_again==1
  52. [net,traininfo] = trainNetwork(trainD,targetD,layers,options);
  53. save result/cnn_net net traininfo
  54. else
  55. load result/cnn_net
  56. end
  57. figure;
  58. yyaxis left; % 激活左边的轴
  59. plot(traininfo.TrainingLoss);
  60. title('CNN');
  61. xlabel('训练次数');
  62. ylabel('损失值'); % 给左y轴添加轴标签
  63. yyaxis right; % 激活右边的轴
  64. plot(traininfo.TrainingAccuracy);
  65. ylabel('正确率'); % 给右y轴添加轴标签
  66. %% test
  67. predictedLabels = classify(net,testD);
  68. save result/cnn_result target_testD predictedLabels
  69. disp('测试集分类正确率为:')
  70. acc=sum(target_testD==predictedLabels)/length(target_testD)
图1 CNN结果

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

        3.2 SSA优化CNN分类模型

  1. clc;clear;close all;format compact;rng(0)
  2. %% 数据处理
  3. load('result/data_process.mat');
  4. method=@mapstd;
  5. % method=@mapminmax;
  6. [xs,mapping]=method(train_X');train_X=xs';
  7. xs=method('apply',test_X',mapping);test_X=xs';
  8. xs=method('apply',valid_X',mapping);valid_X=xs';
  9. N_train=size(train_X,1);
  10. N_feature=size(train_X,2);
  11. for i=1:N_train
  12. trainD(:,:,:,i)=reshape(train_X(i,:),[N_feature 1 1]);
  13. end
  14. N_valid=size(valid_X,1);
  15. for i=1:N_valid
  16. XValidation(:,:,:,i)=reshape(valid_X(i,:),[N_feature 1 1]);
  17. end
  18. N_test=size(test_X,1);
  19. for i=1:N_test
  20. testD(:,:,:,i)=reshape(test_X(i,:),[N_feature 1 1]);
  21. end
  22. targetD=categorical(train_Y);
  23. YValidation=categorical(valid_Y);
  24. target_testD=categorical(test_Y);
  25. %% SSA优化CNN的超参数
  26. %一共有9个参数需要优化,分别是学习率、迭代次数、batchsize、第一层卷积层的核大小、和数量、第2层卷积层的核大小、和数量,以及两个全连接层的神经元数量
  27. optimize=1;%optimize为1就优化 不然就调用之前优化得到的参数直接训练测试
  28. if optimize==1
  29. [x,trace]=ssa_cnn(trainD,targetD,XValidation,YValidation);
  30. save result/ssa_result x trace
  31. else
  32. load result/ssa_result
  33. end
  34. figure
  35. plot(trace)
  36. title('适应度曲线')
  37. xlabel('优化次数')
  38. ylabel('适应度值')
  39. disp('优化后的各超参数')
  40. lr=x(1)%学习率
  41. iter=x(2)%迭代次数
  42. minibatch=x(3)%batchsize
  43. kernel1_size=x(4)
  44. kernel1_num=x(5)%第一层卷积层的核大小
  45. kernel2_size=x(6)
  46. kernel2_num=x(7)%第2层卷积层的核大小
  47. fc1_num=x(8)
  48. fc2_num=x(9)%两个全连接层的神经元数量
  49. %% 利用寻优得到参数重新训练CNN与预测
  50. rng(0)
  51. layers = [
  52. imageInputLayer([size(trainD,1) ,size(trainD,2), size(trainD,3)])
  53. convolution2dLayer(kernel1_size,kernel1_num,'Stride',1,'Padding','same')
  54. % batchNormalizationLayer
  55. reluLayer
  56. maxPooling2dLayer(2,'Stride',2,'Padding','same')% 2x2 kernel stride=2,padding=1
  57. convolution2dLayer(kernel2_size,kernel2_num,'Stride',1,'Padding','same')
  58. % batchNormalizationLayer
  59. reluLayer
  60. maxPooling2dLayer(2,'Stride',2,'Padding','same')% 2x2 kernel stride=2,padding=1
  61. fullyConnectedLayer(fc1_num)
  62. reluLayer
  63. fullyConnectedLayer(fc2_num)
  64. reluLayer
  65. fullyConnectedLayer(10)
  66. softmaxLayer
  67. classificationLayer];
  68. options = trainingOptions('adam', ...
  69. 'ExecutionEnvironment','cpu', ...
  70. 'MaxEpochs',iter, ...
  71. 'MiniBatchSize',minibatch, ...
  72. 'InitialLearnRate',lr, ...
  73. 'GradientThreshold',1, ...
  74. 'shuffle','every-epoch',...
  75. 'Verbose',false);
  76. %%
  77. train_again=1;% 为1就代码重新训练模型,为0就是调用训练好的网络
  78. if train_again==1
  79. [net,traininfo] = trainNetwork(trainD,targetD,layers,options);
  80. save result/ssacnn_net net traininfo
  81. else
  82. load result/ssacnn_net
  83. end
  84. figure;
  85. yyaxis left; % 激活左边的轴
  86. plot(traininfo.TrainingLoss);
  87. title('SSA-CNN');
  88. xlabel('训练次数');
  89. ylabel('损失值'); % 给左y轴添加轴标签
  90. yyaxis right; % 激活右边的轴
  91. plot(traininfo.TrainingAccuracy);
  92. ylabel('正确率'); % 给右y轴添加轴标签
  93. %%
  94. predictedLabels = classify(net,testD);
  95. save result/ssa_cnn_result target_testD predictedLabels
  96. disp('测试集分类正确率为:')
  97. acc=sum(target_testD==predictedLabels)/length(target_testD)

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

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

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

4.代码

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/463578
推荐阅读
相关标签
  

闽ICP备14008679号