适用平台:Matlab 2023及以上

CNN-LSTM-SelfAttention是一种深度学习模型结构,通常用于处理序列数据,尤其适用于具有时空相关性的序列数据。这个结构结合了三种不同类型的神经网络层,以充分捕捉数据中的空间和时间特征,并具有以下结构:

卷积神经网络 (CNN):CNN用于捕捉序列数据中的空间相关性。它通过卷积核在输入数据上滑动,从局部区域提取特征,这有助于检测输入序列中的局部模式和特征。在CNN层之后通常会添加池化层来减小数据的空间维度,以降低计算复杂性。

长短时记忆网络 (LSTM):LSTM用于处理序列数据的时间相关性。它是一种递归神经网络,可以记住并学习输入序列的长期依赖关系。LSTM层通过门控单元来管理信息的流动和记忆。这使得模型能够适应不同时间步长的输入数据。

自注意力层 (Self-Attention):Self-Attention层是一种能够捕捉序列内部元素之间关联性的机制。它允许模型在处理输入序列时关注不同位置的信息,而不仅仅侧重于那些相对较远或相对重要的元素。Self-Attention在NLP领域中广泛使用,但也适用于其他序列数据。

结合这三种层的结构,模型首先通过CNN层来捕捉输入序列的空间特征,然后通过LSTM层来捕捉时间相关性,最后通过Self-Attention层来更好地理解序列内部的关联。这种综合结构可以更全面地处理具有时空相关性的序列数据。适用于,风速预测,光伏功率预测,发电功率预测,海上风电预测,碳价预测等等。它的创新点在于综合了不同类型的神经网络层,使其适用于广泛的应用,从而提高了对序列数据的建模和分析能力。

模型结构:

卷积层提取的特征可视化:

超期24步预测结果对比:

模型部分代码:

%% 参数设置
options = trainingOptions('sgdm', ...   % SGDM 梯度下降算法
    'MaxEpochs',300, ...                % 最大训练次数 300
    'GradientThreshold',1,...           % 渐变的正阈值 1
    'ExecutionEnvironment','cpu',...    % 网络的执行环境 cpu
    'InitialLearnRate',0.01,...         % 初始学习率 0.01
    'LearnRateSchedule','none',...      % 训练期间降低整体学习率的方法 不降低
    'Shuffle','every-epoch',...         % 每次训练打乱数据集
    'SequenceLength',24,...             % 序列长度 24
    'Plots','training-progress',...     % 画出训练曲线
    'MiniBatchSize',15,...              % 训练批次大小 每次训练样本个数15
    'Verbose',0);                       % 有关训练进度的信息不打印到命令窗口中
analyzeNetwork(layers);                 % 分析网络结构
%% 训练网络
net = trainNetwork(XTrain,YTrain,layers,options);

%% 绘制某层的特征图,实现特征可视化
%激活某一层
LayersNeed = activations(net,XTrain,'conv','OutputAs','channels');% 卷积层的特征

%%  画图
numNeed = 3;     % 按需要取几张特征图
for i = 1:numNeed    
LayersFeature = reshape(cell2mat(LayersNeed(1,:)),18,24,32,[]);  %根据analyzeNetwork分析结果,构造合适尺寸的特征图
axes1 = axes('Parent',figure);
hold(axes1,'on');
image(LayersFeature(:,:,i),'Parent',axes1,'CDataMapping','scaled');
colormap(hsv)
xlim([0, size(LayersFeature,2)]);     % 限制坐标轴X
ylim([0, size(LayersFeature,1)]);     % 限制坐标轴Y
end

%% 测试与评估
YPredicted = net.predict(XTest);                       

%% 计算误差
% 过程
error2 = YPredicted-Ytest;              % 测试值和真实值的误差  
[len,~]=size(Ytest);                    % len获取测试样本个数,数值等于testNum,用于求各指标平均值
SSE1=sum(error2.^2);                    % 误差平方和
MAE1=sum(abs(error2))/len;              % 平均绝对误差
MSE1= sumsqr(error2)/len;               % 均方误差
RMSE1=MSE1^(1/2);                       % 均方根误差
MAPE1=mean(abs(error2./mean(Ytest)));   % 平均百分比误差
r=corrcoef(Ytest,YPredicted);           % corrcoef计算相关系数矩阵,包括自相关和互相关系数
R1=r(1,2); 

SST = sum((Ytest - mean(Ytest)).^2);     % 计算总平方和
SSR = sum((Ytest - YPredicted).^2);      % 计算残差平方和
R_squared = (1 - (SSR / SST)).*100;      % 计算R²值
fprintf('R²值为: %.4f\n', R_squared);    % 打印R²值


%% 绘图
figure
plot(Ytest,'m-*','LineWidth',2);
hold on
plot(YPredicted,'c-o','LineWidth',2);
legend('真实值','预测值');
xlabel('预测样本');
ylabel('预测结果');
string={'测试集预测结果对比';['MAPE=' num2str(MAPE1)]};
title(string)
grid

欢迎感兴趣的小伙伴关注并后台留言获取完整版代码哦~,小编会继续推送更有质量的学习资料、文章程序代码~

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐