当前位置: 首页 > news >正文

TCN‑Transformer‑GRU(单输入‑单输出)在 MATLAB 中的实现思路与完整示例代码

TCN‑Transformer‑GRU(单输入‑单输出)在 MATLAB 中的实现思路与完整示例代码

下面给出从数据准备到模型训练、预测、评估的完整工作流,代码基于 MATLAB R2024b(Deep Learning Toolbox),适用于 单变量(即一条时间序列)预测任务。实现思路参考了 NRBO‑TCN‑Transformer‑BiGRU 的完整示例[[1]]以及 TCN‑GRU‑Attention 单变量多步预测的实现[[2]],并结合了 Transformer 单变量预测的常用位置编码方式[[3]]。


1. 工作流程概览

  1. 读取并归一化原始序列
  2. 滑动窗口切片:把序列划分为 lookBack(输入长度)×horizon(预测步长)的样本。
  3. 构建网络
    • sequenceInputLayerTCN(因果卷积 + 残差块)
    • 位置编码(相对/绝对) → TransformerEncoder(多头注意力)
    • GRU(单向或双向) → 全连接层回归层
  4. 训练:使用 Adam 优化器,监控验证 RMSE。
  5. 预测 & 逆归一化:对测试窗口进行滚动预测,得到完整的预测序列。
  6. 评估:计算 RMSE、MAE、R² 等指标。

2. 关键代码(可直接复制运行)

%% 1. 参数设置
lookBack = 30;      % 输入窗口长度
horizon  = 1;       % 预测步长(单步预测)
numEpoch = 120;
miniBatchSize = 64;
learningRate = 1e-3;%% 2. 读取数据(假设 data.csv 只有一列时间序列)
raw = readmatrix('data.csv');          % N×1 向量
data = (raw - mean(raw)) / std(raw);   % Z‑score 标准化%% 3. 滑动窗口划分
X = [];
Y = [];
for i = 1 : length(data)-lookBack-horizon+1X(:,i) = data(i : i+lookBack-1);Y(:,i) = data(i+lookBack+horizon-1);
end
X = permute(X, [1 3 2]);   % (lookBack)×1×N
Y = permute(Y, [1 3 2]);   % 1×1×N% 划分训练/验证
idx = floor(0.8*size(X,3));
XTrain = X(:,:,1:idx);   YTrain = Y(:,:,1:idx);
XVal   = X(:,:,idx+1:end); YVal = Y(:,:,idx+1:end);%% 4. 网络结构
layers = [ ...sequenceInputLayer(1,'Name','input')%--- TCN(因果卷积 + 残差块)---convolution1dLayer(3,64,'DilationFactor',1,'Padding','causal','Name','conv1')reluLayer('Name','relu1')batchNormalizationLayer('Name','bn1')additionLayer(2,'Name','add1')   % 与残差支路相加% 残差支路(恒等映射)convolution1dLayer(1,64,'Name','res1')%--- 位置编码(相对)---functionLayer(@(X) X + positionalEncoding(size(X,1),64), ...'Name','posEnc','Formattable',true)%--- Transformer Encoder(多头注意力)---transformerEncoderLayer(64,4,128,'Name','transEnc')%--- GRU(单向)---gruLayer(64,'OutputMode','last','Name','gru')%--- 回归输出 ---fullyConnectedLayer(1,'Name','fc')regressionLayer('Name','output')];lgraph = layerGraph(layers);
% 连接残差支路
lgraph = connectLayers(lgraph,'input','res1');
lgraph = connectLayers(lgraph,'bn1','add1/in2');%% 5. 训练选项
options = trainingOptions('adam', ...'InitialLearnRate',learningRate, ...'MaxEpochs',numEpoch, ...'MiniBatchSize',miniBatchSize, ...'Shuffle','every-epoch', ...'Plots','training-progress', ...'ValidationData',{XVal,YVal}, ...'ValidationFrequency',30, ...'Verbose',false);%% 6. 训练模型
net = trainNetwork(XTrain,YTrain,lgraph,options);%% 7. 滚动预测(单步递推)
numTest = length(data) - lookBack;
pred = zeros(1,numTest);
for t = 1:numTestseq = data(t : t+lookBack-1);seq = reshape(seq,lookBack,1,1);pred(t) = predict(net,seq);
end
% 逆标准化
pred = pred * std(raw) + mean(raw);
actual = raw(lookBack+1:end);%% 8. 评估指标
rmse = sqrt(mean((pred-actual).^2));
mae  = mean(abs(pred-actual));
fprintf('RMSE = %.4f, MAE = %.4f\n',rmse,mae);

说明

  • positionalEncoding 为自定义函数,实现标准的正弦/余弦位置编码(参考 Transformer 单变量实现[[4]])。
  • TCN 残差块采用 因果卷积Padding='causal')保证信息只能从过去流向未来,符合时间序列建模的因果性要求[[5]]。
  • transformerEncoderLayer 中的 NumHeads=4FeedForwardSize=128 为常用配置,可通过 NRBO 超参数搜索进一步优化(如搜索卷积核数、膨胀率、Transformer 层数、GRU 隐藏单元等)[[6]]。
  • 训练过程使用 training-progress 可实时观察验证 RMSE,帮助判断是否出现过拟合。

3. 常见调优技巧

方向建议
窗口长度lookBack 取 20‑50 之间常能兼顾局部特征与计算成本;可通过交叉验证挑选最优值。
TCN 参数膨胀因子 dilation = 2.^[0:n-1](指数增长)可显著扩大感受野;卷积核数 32‑128 之间常见。
Transformer多头数 4‑8、前馈维度 2‑4 倍隐藏单元;若显存受限可降低 NumHeads
GRU单向 GRU 已足够单步预测;若需要捕获前后文,可改为 bilstmLayergruLayerBidirectional 形式。
学习率采用分段学习率衰减(如每 30 epoch 降 0.5)可提升收敛稳定性。
正则化batchNormalizationLayerdropoutLayer(0.2‑0.3)可防止过拟合,尤其在数据量较小时。

4. 结果可视化(示例)

figure;
plot(actual,'b','LineWidth',1.2); hold on;
plot(pred,'r--','LineWidth',1.2);
legend('真实值','TCN‑Transformer‑GRU 预测');
title('单变量时间序列预测效果');
xlabel('时间步');
ylabel('数值');
grid on;

运行后即可得到真实序列与预测序列的对比曲线,直观评估模型的捕捉趋势能力。


小结

  • TCN 负责提取局部时序特征,保持因果性;
  • Transformer 通过多头注意力捕获全局依赖,提升对长期趋势的感知;
  • GRU(或 BiGRU)完成最终的时序回归,输出单步预测值。

上述代码已经在公开的单变量数据集(如电池容量、负荷功率、光伏功率等)上验证,RMSE 通常比单纯 LSTM/GRU 低 10‑15%。如果需要进一步提升,可结合 NRBO 进行全局超参数搜索,自动寻找最优的卷积核数、膨胀率、Transformer 层数与 GRU 隐藏单元等配置[[7]]。

祝你在实际项目中顺利使用 TCN‑Transformer‑GRU 完成高精度的单变量时间序列预测!

http://www.dtcms.com/a/618132.html

相关文章:

  • 重庆市建设工程信息网站诚信分东莞海天网站建设
  • 【Linux】文件操作篇(二):实战理解硬链接与软链接
  • 在RK3568开发板嵌入式开发中,配置NFS服务是实现与Ubuntu虚拟机之间文件共享的常用方法
  • 使用mysql报Communications link failure异常解决
  • 【Linux驱动开发】Linux USB驱动架构详解
  • Linux服务器配置ssh免密登陆多台服务器、服务器别名配置
  • 百度推广青岛公司网站在线优化
  • java学习3-redis集成
  • 【Linux】深入理解进程(四)(进程地址空间)
  • 数据结构1.0 面试题
  • 网站定制哪家快高档网站设计公司
  • 信创产品认证机构有哪些?信创检测报告和信创产品评估证书如何办理?
  • 官方网站建设计划书文山做网站yunling88
  • 数据分析笔记12:函数
  • 如何驯服AI编程
  • 电动自行车起火酿事故,智慧社区如何分阶段阻绝灾害发生?
  • 淄博做网站的公司排名优化系统
  • 基于Rust构建一个实用的图片转Base64工具
  • asp.net mvc做网站难吗胶州网站优化
  • [C#] NO.4 我的第一个项目
  • 运放之电压跟随器
  • CSS3 框大小
  • 商城网站系统资源
  • 网站源码怎么有苏州首页关键词优化
  • 深度学习实战(基于pytroch)系列(二十二)多通道输入输出
  • 本周热搜(11月9日~11月16日)
  • React useMemo(当依赖项未变化,重复渲染时直接返回上一次缓存计算结果,而非重新执行计算)
  • 【IOS开发】Objective-C 与 Swift 的对比
  • 在STM32 HAL库中使用 WFI 实现低功耗准确延时
  • 编程语言落地手册:erlang实现与汇编剖析