分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测

预测效果

分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测的图1

分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测的图2

分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测的图3

分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测的图4

分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测的图5

分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测的图6

使用教程

1 基本介绍

1.MATLAB实现WOA-CNN-LSTM-Attention数据分类预测,运行环境Matlab2021b及以上;

2.基于鲸鱼优化算法(WOA)、卷积神经网络(CNN)和长短期记忆网络(LSTM)的数据分类预测程序;

3.多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用;过WOA优化算法优化学习率、卷积核大小、神经元个数,这3个关键参数,以测试集精度最高为目标函数

程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩阵图;

4.data为数据集,输入12个特征,分四类;main为主程序,其余为函数文件,无需运行,可在下载区获取数据和程序内容。

5.适用领域:适用于各种数据分类场景,如滚动轴承故障、变压器油气故障、电力系统输电线路故障区域、绝缘子、配网、电能质量扰动,等领域的识别、诊断和分类。

使用便捷:直接使用EXCEL表格导入数据,无需大幅修改程序。内部有详细注释,易于理解。

2 研究内容

注意力机制模块:

SEBlock(Squeeze-and-Excitation Block)是一种聚焦于通道维度而提出一种新的结构单元,为模型添加了通道注意力机制,该机制通过添加各个特征通道的重要程度的权重,针对不同的任务增强或者抑制对应的通道,以此来提取有用的特征。该模块的内部操作流程如图,总体分为三步:首先是Squeeze 压缩操作,对空间维度的特征进行压缩,保持特征通道数量不变。融合全局信息即全局池化,并将每个二维特征通道转换为实数。实数计算公式如公式所示。该实数由k个通道得到的特征之和除以空间维度的值而得,空间维数为H*W。其次是Excitation激励操作,它由两层全连接层和Sigmoid函数组成。如公式所示,s为激励操作的输出,σ为激活函数sigmoid,W2和W1分别是两个完全连接层的相应参数,δ是激活函数ReLU,对特征先降维再升维。最后是Reweight操作,对之前的输入特征进行逐通道加权,完成原始特征在各通道上的重新分配。

分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测的图7

3 网络结构


设置网络参数


%%  数据归一化[p_train, ps_input] = mapminmax(P_train, 0, 1);p_test = mapminmax('apply', P_test, ps_input );t_train = T_train;t_test  = T_test ;
%%  特征选择后的数据集p_train = p_train(save_index, :);p_test  = p_test (save_index, :);
%%  输出编码t_train = ind2vec(t_train);t_test  = ind2vec(t_test );
%%  数据反归一化T_sim1 = vec2ind(t_sim1);T_sim2 = vec2ind(t_sim2);
%%  性能评价error1 = sum((T_sim1 == T_train)) / M * 100 ;error2 = sum((T_sim2 == T_test )) / N * 100 ;
%%  绘图figureplot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1)legend('真实值', '预测值')xlabel('预测样本')ylabel('预测结果')string = {'训练集预测结果对比'; ['准确率=' num2str(error1) '%']};title(string)grid
figureplot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1)legend('真实值', '预测值')xlabel('预测样本')ylabel('预测结果')string = {'测试集预测结果对比'; ['准确率=' num2str(error2) '%']};title(string)grid
%%  优化算法参数设置SearchAgents_no = 8;                   % 数量Max_iteration = 5;                    % 最大迭代次数dim = 3;                               % 优化参数个数lb = [1e-3,10 1e-4];                 % 参数取值下界(学习率,隐藏层节点,正则化系数)ub = [1e-2, 30,1e-1];                 % 参数取值上界(学习率,隐藏层节点,正则化系数)
fitness = @(x)fical(x,num_dim,num_class,p_train,t_train,T_train);
[Best_score,Best_pos,curve]=WOA(SearchAgents_no,Max_iteration,lb ,ub,dim,fitness)Best_pos(1, 2) = round(Best_pos(1, 2));   best_hd  = Best_pos(1, 2); % 最佳隐藏层节点数best_lr= Best_pos(1, 1);% 最佳初始学习率best_l2 = Best_pos(1, 3);% 最佳L2正则化系数 %% 建立模型lgraph = layerGraph();                                                   % 建立空白网络结构tempLayers = [    sequenceInputLayer([num_dim, 1, 1], "Name", "sequence")              % 建立输入层,输入数据结构为[num_dim, 1, 1]    sequenceFoldingLayer("Name", "seqfold")];                            % 建立序列折叠层lgraph = addLayers(lgraph, tempLayers);                                  % 将上述网络结构加入空白结构中tempLayers = [    convolution2dLayer([3, 1], 16, "Name", "conv_1", "Padding", "same")  % 建立卷积层,卷积核大小[3, 1],16个特征图    reluLayer("Name", "relu_1")                                          % Relu 激活层
lgraph = addLayers(lgraph, tempLayers);                                  % 将上述网络结构加入空白结构中
tempLayers = [    sequenceUnfoldingLayer("Name", "sequnfold")                      % 建立序列反折叠层    flattenLayer("Name", "flatten")                                  % 网络铺平层    bilstmLayer(best_hd, "Name", "bilstm", "OutputMode","last")              % BiLSTM层    fullyConnectedLayer(num_class, "Name", "fc")                     % 全连接层    softmaxLayer("Name", "softmax")                                  % softmax激活层    classificationLayer("Name", "classification")];                  % 分类层lgraph = addLayers(lgraph, tempLayers);                              % 将上述网络结构加入空白结构中lgraph = connectLayers(lgraph, "seqfold/out", "conv_1");             % 折叠层输出 连接 卷积层输入lgraph = connectLayers(lgraph, "seqfold/miniBatchSize", "sequnfold/miniBatchSize");                                                                     % 折叠层输出连接反折叠层输入lgraph = connectLayers(lgraph, "relu_2", "sequnfold/in");            % 激活层输出 连接 反折叠层输入
%% 参数设置options = trainingOptions('adam', ...     % Adam 梯度下降算法    'MaxEpochs', 500,...                 % 最大训练次数    'InitialLearnRate', best_lr,...          % 初始学习率为0.001    'L2Regularization', best_l2,...         % L2正则化参数    'LearnRateSchedule', 'piecewise',...  % 学习率下降    'LearnRateDropFactor', 0.1,...        % 学习率下降因子 0.1    'LearnRateDropPeriod', 400,...        % 经过训练后 学习率为 0.001*0.1    'Shuffle', 'every-epoch',...          % 每次训练打乱数据集    'ValidationPatience', Inf,...         % 关闭验证    'Plots', 'training-progress',...      % 画出曲线    'Verbose', false);
%% 训练net = trainNetwork(p_train, t_train, lgraph, options);

完整代码

注意:

class
% @author : 机器学习之心
% 完整代码:https://mbd.pub/o/bread/mbd-ZJ6WlJpt

% @author : 机器学习之心

end
文章来源:机器学习之心

默认 最新
当前暂无评论,小编等你评论哦!
点赞 评论 收藏
关注