基于TCN-GRU-Attention的数据时序预测

文摘   2024-08-01 08:30   湖南  

代码原理

基于TCN-GRU-Attention的数据时序预测模型结合了时间卷积网络(TCN)、门控循环单元(GRU)和注意力机制(Attention)。这种结构在处理时间序列数据时非常有效,下面是简单的原理和流程介绍:

1.时间卷积网络(TCN)部分:

  • TCN是一种使用一维卷积层的深度神经网络结构,特别适合捕捉时间序列中的长期依赖关系。它通过堆叠多个卷积层和残差连接来有效地扩展输入序列的感受野,并提取不同时间尺度下的特征。

2.门控循环单元(GRU)部分:

  • GRU是一种门控循环神经网络,类似于LSTM但更简单。它具有更新门和重置门,能够有效地捕捉时间序列中的短期依赖关系。在TCN-GRU结构中,GRU负责处理从TCN中提取的特征序列,以进一步学习和表示时间序列的动态特性。

3.注意力机制(Attention)部分:

  • 注意力机制允许模型动态地学习和集中处理输入序列中的重要部分。在时序预测任务中,通过注意力机制,模型可以自适应地选择性地关注那些在预测过程中最有用的时间步或特征。

4.整体流程:

  • 输入的时序数据首先通过一维卷积层堆叠的TCN,用于提取和压缩不同时间尺度下的特征。

  • TCN的输出序列经过门控循环单元(GRU),GRU层能够学习和捕捉时间序列中的长期依赖关系和动态模式。

  • GRU的输出可以通过注意力机制进行加权,以提升模型对重要特征的关注度。

  • 最后,经过适当的输出层(如全连接层),模型生成时间序列的预测结果。

  • 训练过程中通常使用适当的损失函数(如均方误差)和优化器(如Adam),通过反向传播来调整模型参数,使其能够更好地适应和预测时间序列数据。

通过结合TCN、GRU和注意力机制,这种模型能够有效地处理复杂和长期依赖的时间序列数据,提高预测的准确性和泛化能力,适用于各种时序预测任务。

部分代码

%%  清空环境变量warning off             % 关闭报警信息close all               % 关闭开启的图窗clear                   % 清空变量clc  %% 导入数据data =  readmatrix('风电场预测.xlsx');data = data(5665:8640,12);  %选取3月份数据[h1,l1]=data_process(data,24);   %步长为24,采用前24个时刻的温度预测第25个时刻的温度res = [h1,l1];num_samples = size(res,1);   %样本个数% 训练集和测试集划分outdim = 1;                                  % 最后一列为输出num_size = 0.7;                              % 训练集占数据集比例num_train_s = round(num_size * num_samples); % 训练集样本个数f_ = size(res, 2) - outdim;                  % 输入特征维度P_train = res(1: num_train_s, 1: f_)';T_train = res(1: num_train_s, f_ + 1: end)';M = size(P_train, 2);P_test = res(num_train_s + 1: end, 1: f_)';T_test = res(num_train_s + 1: end, f_ + 1: end)';N = size(P_test, 2);%  数据归一化[p_train, ps_input] = mapminmax(P_train, 0, 1);p_test = mapminmax('apply', P_test, ps_input);[t_train, ps_output] = mapminmax(T_train, 0, 1);t_test = mapminmax('apply', T_test, ps_output);%  格式转换for i = 1 : M     vp_train{i, 1} = p_train(:, i);    vt_train{i, 1} = t_train(:, i);endfor i = 1 : N     vp_test{i, 1} = p_test(:, i);    vt_test{i, 1} = t_test(:, i);end%% 优化算法优化前,构建优化前的TCN_GRU-ATTENTION模型outputSize = 1;  %数据输出y的维度  numFilters = 64;filterSize = 5;dropoutFactor = 0.005;numBlocks = 2;layer = sequenceInputLayer(f_,Normalization="rescale-symmetric",Name="input");lgraph = layerGraph(layer);outputName = layer.Name;for i = 1:numBlocks    dilationFactor = 2^(i-1);
layers = [ convolution1dLayer(filterSize,numFilters,DilationFactor=dilationFactor,Padding="causal",Name="conv1_"+i) layerNormalizationLayer dropoutLayer(dropoutFactor) % spatialDropoutLayer(dropoutFactor) convolution1dLayer(filterSize,numFilters,DilationFactor=dilationFactor,Padding="causal") layerNormalizationLayer reluLayer dropoutLayer(dropoutFactor) additionLayer(2,Name="add_"+i)]; % Add and connect layers. lgraph = addLayers(lgraph,layers); lgraph = connectLayers(lgraph,outputName,"conv1_"+i); % Skip connection. if i == 1 % Include convolution in first skip connection. layer = convolution1dLayer(1,numFilters,Name="convSkip"); lgraph = addLayers(lgraph,layer); lgraph = connectLayers(lgraph,outputName,"convSkip"); lgraph = connectLayers(lgraph,"convSkip","add_" + i + "/in2"); else lgraph = connectLayers(lgraph,outputName,"add_" + i + "/in2"); end
% Update layer output name. outputName = "add_" + i;endtempLayers = flattenLayer("Name","flatten");lgraph = addLayers(lgraph,tempLayers);tempLayers = gruLayer(35,"Name","gru1");lgraph = addLayers(lgraph,tempLayers);tempLayers = [ selfAttentionLayer(1,50,"Name","selfattention") % %单头注意力Attention机制,把1改为2,3,4……即为多头,后面的50是键值 fullyConnectedLayer(outdim,"Name","fc") regressionLayer("Name","regressionoutput")];lgraph = addLayers(lgraph,tempLayers);lgraph = connectLayers(lgraph,outputName,"flatten");lgraph = connectLayers(lgraph,"flatten","gru1");lgraph = connectLayers(lgraph,"gru1","selfattention");

代码效果图









下载链接:
或点击阅读原文

MATLAB科研小白
信号处理方向在校博士研究生,目前专研于MATLAB算法及科学绘图等,熟知各种信号分解算法、神经网络时序预测算法、数据拟合算法以及滤波算法。提供一个可以相互学习相互进步的平台
 最新文章