适用平台:Matlab2023版及以上
基于BiTCN-BiGRU-Attention双向时间卷积结合双向门控循环单元融合多头注意力机制预测模型,在TCN的基础之上加入了双向支路(BiTCN),双向门控循环单元(BiGRU)同时融合多头自注意力机制(Multihead Self-Attention);没有人写过,创新性极高!
原理介绍:
膨胀因果卷积:与因果卷积相比,膨胀因果卷积多了一个用来表示扩张大小的参数——扩张率(dilationrate)。这使得扩张卷积具有更大的感受野(receptivefield),这样每个卷积输出可包含更大时间范围的信息。采用扩张卷积的优势在于,对于相同长度的输入层时间序列,扩张卷积可通过更少的网络层数获得输出。这样一来,对于需获取更长时间信息的时间序列问题,可避免普通卷积由于层数过多而带来梯度消失、训练复杂等问题。扩张卷积的结构如下图所示。
BiTCN-BiGRU-Attention多变量预测模型创新点总结:
创新点①膨胀因果卷积:为了更好地获取风电系列的长期依赖关系,BiTCN模型采用了双向膨胀因果卷积,引入双向扩张因子使卷积核的感知野不断扩大,从而获得更大的感受野。这种结构增强了信息提取能力,提高了特征提取的质量。
创新点②双向时序特征:双向时间卷积相比于TCN在风力发电预测中发挥的作用是提取输入序列中前向和后向的时间信息,以获得更好的特征提取能力。传统的TCN只考虑了输入序列的前向卷积计算,而忽略了后向信息对预测结果的影响。而双向时间卷积则能够通过同时考虑前向和后向信息来捕捉风力发电序列的隐藏特征,从而更好地获取长期依赖性。
创新点③残差连接结构:为了避免梯度消失和收敛缓慢等问题,BiTCN模型引入了残差块,构造了恒等映射,使得模型结构朝着恒等映射的方向收敛,避免预测误差随着网络的加深而增大,同时解决了因网络加深造成的梯度爆炸和梯度消失的问题。
创新点④递归堆叠:模型中可以通过递归地堆叠多个 BiTCN 模块来提高模型的表达能力。递归堆叠允许模型在不同抽象层次上逐步提取和融合特征,从而更好地预测时间序列。
创新点⑤双向门控循环单元网络:BiGRU 是一种能够捕捉序列中长距离依赖关系的递归神经网络。通过双向性,BiGRU 可以同时考虑过去和未来的信息,提高了模型对时间序列动态变化的感知能力。
创新点⑥Attention自注意力机制:在BiTCN-Attention中,自注意力层被嵌入到BiTCN层中,自注意力层用于捕捉时间序列数据中的全局依赖关系,自注意力机制允许网络在学习时动态地调整各个时间步的权重,以便更好地捕捉长期依赖和全局模式。
程序数据集格式:
当天18个气象特征(特征),采样时间为24小时,输出为当天的24小时的功率出力(真实值),也就是18×24输入,1×24输出,一共有75个这样的样本。
程序结果:模型结
预测值与实际值对比:
特征可视化:
训练曲线:
评价指标结果:
部分核心代码:
完整代码:https://mbd.pub/o/bread/mbd-ZZiZlJpv
%% 设置BiTCN-BiGRU-Attention网络参数
numFilters = 16; % 卷积核个数
filterSize = 3; % 卷积核大小
dropoutFactor = 0.2 ; % 空间丢失因子
numBlocks = 1; % 残差块个数
numFeatures = 18; % 特征个数
% 创建输入层
layer = sequenceInputLayer(numFeatures, Normalization = "rescale-symmetric", Name = "input");
% 创建网络图
lgraph = layerGraph(layer);
outputName = layer.Name;
% 建立网络结构 -- 残差块
for i = 1 : numBlocks
% 膨胀因子
dilationFactor = 2^(i-1);
% 创建TCN正向支路
layers = [
convolution1dLayer(filterSize, numFilters, DilationFactor = dilationFactor, Padding = "causal", Name="conv1_" + i) % 一维卷积层
layerNormalizationLayer % 层归一化
spatialDropoutLayer(dropoutFactor) % 空间丢弃层
convolution1dLayer(filterSize, numFilters, DilationFactor = dilationFactor, Padding = "causal") % 一维卷积层
layerNormalizationLayer % 层归一化
reluLayer % 激活层
spatialDropoutLayer(dropoutFactor) % 空间丢弃层
additionLayer(4, Name = "add_" + i)
];
% 添加残差块到网络
lgraph = addLayers(lgraph, layers);
% 连接卷积层到残差块
lgraph = connectLayers(lgraph, outputName, "conv1_" + i);
% 创建 TCN反向支路flip网络结构
Fliplayers = [
FlipLayer("flip_" + i) % 反向翻转
convolution1dLayer(1, numFilters, Name = "convSkip_"+i); % 反向残差连接
convolution1dLayer(filterSize, numFilters, DilationFactor = dilationFactor, Padding = "causal", Name="conv2_" + i) % 一维卷积层
layerNormalizationLayer % 层归一化
spatialDropoutLayer(dropoutFactor) % 空间丢弃层
convolution1dLayer(filterSize, numFilters, DilationFactor = dilationFactor, Padding = "causal") % 一维卷积层
layerNormalizationLayer % 层归一化
reluLayer % 激活层
spatialDropoutLayer(dropoutFactor, Name="drop" + i) % 空间丢弃层
];
% 添加 flip 网络结构到网络
lgraph = addLayers(lgraph, Fliplayers);
部分图片来源于网络,侵权联系删除!
欢迎感兴趣的小伙伴关注,小编会继续推送更有质量的学习资料、文章和程序代码!
版权声明:本文为博主作者:预测及优化原创文章,版权归属原作者,如果侵权,请联系我们删除!
原文链接:https://blog.csdn.net/weixin_48747334/article/details/135139595