适用平台:Matlab2023版及以上
CNN卷积神经网络是1989年提出的;LSTM长短期记忆网络是1997年提出的;
GRU门控循环单元网络是2014年提出的;TCN时间卷积网络是2016年提出的;
单一的TCN时间卷积网络当前研究仍具有一定创新性,而本文提出BiTCN-Attention双向时间卷积融合多头注意力机制预测模型,在TCN的基础之上加入了双向支路,同时融合多头自注意力机制(Multihead Self-Attention),创新性极高!
完整代码:https://mbd.pub/o/bread/mbd-ZZiUlZls
原理介绍:卷积和因果卷积:传统的卷积网络(convolutionalneuralnetworks,CNN)无法直接处理时间序列问题,而使用因果卷积(causalconvolutions),其作用就是为了处理序列问题,即对于时间序列问题只能使用预测值yt的t时刻之前的特征量输入x1~xt-1来进行预测。普通卷积和因果卷积的结构示意图如下图a和图b所示,可看出传统卷积网络的每个神经元会使用前一层的所有信息来提取特征,而因果卷积只使用预测目标所在时刻之前的信息。
因果卷积和膨胀因果卷积:与因果卷积相比,扩张卷积(dilatedconvolutions)多了一个用来表示扩张大小的参数——扩张率(dilationrate)。这使得扩张卷积具有更大的感受野(receptivefield),这样每个卷积输出可包含更大时间范围的信息。采用扩张卷积的优势在于,对于相同长度的输入层时间序列,扩张卷积可通过更少的网络层数获得输出。这样一来,对于需获取更长时间信息的时间序列问题,可避免普通卷积由于层数过多而带来梯度消失、训练复杂等问题。扩张卷积的结构如图c示。
BiTCN-Attention多变量预测模型创新点总结:
创新点①引入双向膨胀因果卷积:为了更好地获取风电系列的长期依赖关系,BiTCN模型采用了双向膨胀因果卷积,引入双向扩张因子使卷积核的感知野不断扩大,从而获得更大的感受野。这种结构增强了信息提取能力,提高了特征提取的质量。
创新点②双向时序特征:双向时间卷积相比于TCN在风力发电预测中发挥的作用是提取输入序列中前向和后向的时间信息,以获得更好的特征提取能力。传统的TCN只考虑了输入序列的前向卷积计算,而忽略了后向信息对预测结果的影响。而双向时间卷积则能够通过同时考虑前向和后向信息来捕捉风力发电序列的隐藏特征,从而更好地获取长期依赖性。
创新点③残差连接结构:为了避免梯度消失和收敛缓慢等问题,BiTCN模型引入了残差块,构造了恒等映射,使得模型结构朝着恒等映射的方向收敛,避免预测误差随着网络的加深而增大,同时解决了因网络加深造成的梯度爆炸和梯度消失的问题。
创新点④Attention自注意力机制:在BiTCN-Attention中,自注意力层被嵌入到BiTCN层中,自注意力层用于捕捉时间序列数据中的全局依赖关系,自注意力机制允许网络在学习时动态地调整各个时间步的权重,以便更好地捕捉长期依赖和全局模式。
数据集格式:
前一天18个气象特征,采样时间为24小时,输出为第二天的24小时的功率出力,也就是18×24输入,1×24输出,一共有75个这样的样本。
程序结果:模型结构;预测值与实际值对比
特征可视化;训练曲线:
部分核心代码:
完整代码:https://mbd.pub/o/bread/mbd-ZZiUlZls
% 设置网络参数
numFilters = 16; % 卷积核个数
filterSize = 3; % 卷积核大小
dropoutFactor = 0.5 ; % 空间丢失因子
numBlocks = 2; % 残差块个数
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);
% 连接 flip 卷积层到残差块
lgraph = connectLayers(lgraph, outputName, "flip_" + i);
lgraph = connectLayers(lgraph, "drop" + i, "add_" + i + "/in3");
lgraph = connectLayers(lgraph, "convSkip_"+i, "add_" + i + "/in4");
% 残差连接 -- 首层
if i == 1
% 建立残差卷积层
部分图片来源于网络,侵权联系删除!
欢迎感兴趣的小伙伴关注下方公众号或代码末尾链接获得完整版代码,小编会继续推送更有质量的学习资料、文章和程序代码!