CNN-LSTM-Attention基于卷积神经网络-长短期记忆网络结合注意力机制的多变量时间...
CNN-LSTM-Attention基于卷积神经网络-长短期记忆网络结合注意力机制的多变量时间序列预测 Matlab语言注释清晰,适合小白。CNN-LSTM-Attention基于卷积神经网络-长短期记忆网络结合注意力机制的多变量时间序列预测 Matlab语言注释清晰,适合小白。下期可能会讲讲如何结合迁移学习提升小样本预测效果。attention注意力机制:为模型提供了对关键信息的聚焦能力,从而提
CNN-LSTM-Attention基于卷积神经网络-长短期记忆网络结合注意力机制的多变量时间序列预测 Matlab语言 注释清晰,适合小白 多特征输入,LSTM也可以换成GRU、BiLSTM,Matlab版本要在2020b及以上。 模型内容: 卷积神经网络 (CNN):捕捉数据中的局部模式和特征。 长短期记忆网络 (LSTM):处理数据捕捉长期依赖关系。 attention注意力机制:为模型提供了对关键信息的聚焦能力,从而提高预测的准确度。 注:
最近在折腾多变量时间序列预测,发现传统LSTM在处理复杂特征时总差点意思。尝试把CNN的局部特征提取能力和Attention机制的关键信息筛选功能结合进来,效果意外不错。今天咱们用Matlab(2020b及以上)手把手实现这个CNN-LSTM-Attention混合模型,小白也能轻松上车。
CNN-LSTM-Attention基于卷积神经网络-长短期记忆网络结合注意力机制的多变量时间序列预测 Matlab语言 注释清晰,适合小白 多特征输入,LSTM也可以换成GRU、BiLSTM,Matlab版本要在2020b及以上。 模型内容: 卷积神经网络 (CNN):捕捉数据中的局部模式和特征。 长短期记忆网络 (LSTM):处理数据捕捉长期依赖关系。 attention注意力机制:为模型提供了对关键信息的聚焦能力,从而提高预测的准确度。 注:
先看数据准备。假设我们有10个传感器采集的工业数据(10特征),每5分钟记录一次。目标是根据前24小时数据(288个时间步)预测未来1小时温度:
% 加载示例数据(需替换为实际数据)
load('multivariate_data.mat'); % 数据维度:[样本数, 时间步, 特征数]
data = reshape(data, [size(data,1), 288, 10]);
% 划分训练测试集
train_ratio = 0.8;
split_idx = floor(size(data,1)*train_ratio);
train_data = data(1:split_idx,:,:);
test_data = data(split_idx+1:end,:,:);
模型架构是核心。先上CNN提取空间特征,再用LSTM捕捉时间依赖,最后用Attention突出重点时间步:
layers = [
sequenceInputLayer(10) % 10个特征输入
% CNN模块
convolution1dLayer(3, 64, 'Padding','same') % 1D卷积核
reluLayer
maxPooling1dLayer(2,'Stride',2)
% LSTM模块(可替换为GRU/BiLSTM)
lstmLayer(100,'OutputMode','sequence')
% Attention机制
attentionLayer('AttentionSize',50) % 自定义注意力层
fullyConnectedLayer(12) % 预测未来12个时间步(1小时)
regressionLayer];
这里有几个关键点:
- 卷积核大小设为3,能有效捕捉相邻时间点的局部模式
- 注意力层需要自定义实现(Matlab目前没有原生支持):
classdef attentionLayer < nnet.layer.Layer
properties
AttentionSize
end
methods
function layer = attentionLayer(args)
layer.AttentionSize = args.AttentionSize;
end
function Z = predict(layer, X)
% X输入维度:[特征数, 时间步, 批大小]
[numFeatures, numTimeSteps] = size(X,1:2);
% 计算注意力权重
attentionWeights = fullyConnectedLayer(layer.AttentionSize, 'Name', 'att_fc1')(X);
attentionWeights = relu(attentionWeights);
attentionWeights = fullyConnectedLayer(1, 'Name', 'att_fc2')(attentionWeights);
attentionWeights = softmax(attentionWeights, 'DataFormat', 'CTB');
% 加权求和
Z = sum(X .* attentionWeights, 2);
end
end
end
训练参数设置直接影响收敛速度。推荐用Adam优化器搭配学习率衰减:
options = trainingOptions('adam', ...
'MaxEpochs', 50, ...
'MiniBatchSize', 32, ...
'InitialLearnRate', 0.001, ...
'LearnRateDropPeriod', 10, ...
'Verbose', true);
训练完成后,预测结果可视化能直观看出效果:
pred = predict(net, testData);
plot([actuals(1:100), pred(1:100)]);
legend('真实值','预测值');
title('预测效果对比');
xlabel('时间步'); ylabel('温度');
几个实用技巧:
- 特征工程比模型更重要:尝试对输入数据做差分、标准化
- 超参数调优:用贝叶斯优化自动搜索最佳参数组合
- 模型变体:把LSTM换成GRU(训练更快)或BiLSTM(捕捉双向依赖)
遇到训练不收敛时,检查梯度是否爆炸(添加梯度裁剪)、尝试降低学习率。实际在风电功率预测场景中,这个模型相比纯LSTM的MAE降低了18%左右。不过也别迷信模型,工业数据中的异常值和缺失值处理同样关键。
完整代码已打包放在GitHub(地址见评论区),包含数据预处理模板和多种模型变体实现。下期可能会讲讲如何结合迁移学习提升小样本预测效果。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)