分類預測 | 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
文章來源:機器學習之心

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP