适用平台:Matlab 2023及以上

本程序参考中文期刊《基于AVMD-CNN-GRU-Attention的超短期风功率预测研究》中的预测模型CNN-GRU-Attention,程序注释清晰,干货满满,下面对文章和程序做简要介绍。

CNN-GRU-Attention预测模型的创新点如下:

CNN部分:模型采用了卷积神经网络(CNN)进行特征提取。将各子模态输入到CNN网络中进行特征抽取。这样可以从多维历史数据中提取出有用的特征信息,为后续的预测提供更准确的输入。

GRU部分:模型使用了门控循环单元(GRU)作为时序建模的方法。在CNN提取的特征序列上,通过GRU模型对特征序列的时序前后关系进行建模,从而捕捉到序列中的长期依赖关系。这样可以更好地利用序列数据中的时间信息,提高预测的准确性。

Attention部分:模型引入了注意力机制(Attention)对GRU模型的输出进行加权。通过对GRU输出的隐藏层状态参数进行重新分配权值,模型可以更加关注重要的时间步并忽略无关的信息,从而提高预测的精度。这样可以有效地提高模型对特征序列中不同部分的关注程度,提升预测的准确性。

CNN-GRU-Attention预测模型结构:

预测值与实际值对比:

卷积层所提的特征可视化:

数据格式:多变量回归预测程序是这样的,输入前一天18个气象特征,采样时间为24小时,输出为第二天的24小时的功率出力,也就是18×24输入,1×24输出,一共有75个这样的样本

部分代码:

%% CNN-GRU-Attention网络搭建
layers = [
    sequenceInputLayer([18 24 1],"Name","sequence")
    convolution2dLayer([3 3],32,"Name","conv","Padding","same")
    batchNormalizationLayer("Name","batchnorm")
    reluLayer("Name","relu")
    maxPooling2dLayer([3 3],"Name","maxpool","Padding","same")
    flattenLayer("Name","flatten")
    gruLayer(50,"Name","gru")
    selfAttentionLayer(1,50,"Name","selfattention")
    fullyConnectedLayer(24,"Name","fc")
    regressionLayer("Name","regressionoutput")];

%% 参数设置
options = trainingOptions('sgdm', ...   % SGDM 梯度下降算法
    'MaxEpochs',300, ...                % 最大训练次数 300
    'GradientThreshold',1,...           % 渐变的正阈值 1
    'ExecutionEnvironment','cpu',...    % 网络的执行环境 cpu
    'InitialLearnRate',0.01,...         % 初始学习率 0.01
    'LearnRateSchedule','none',...      % 训练期间降低整体学习率的方法 不降低
    'Shuffle','every-epoch',...         % 每次训练打乱数据集
    'SequenceLength',24,...             % 序列长度 24
    'Plots','training-progress',...     % 画出训练曲线
    'MiniBatchSize',15,...              % 训练批次大小 每次训练样本个数15
    'Verbose',0);                       % 有关训练进度的信息不打印到命令窗口中
analyzeNetwork(layers);                 % 分析网络结构
%% 训练网络
net = trainNetwork(XTrain,YTrain,layers,options);

%% 绘制某层的特征图,实现特征可视化
%激活某一层
LayersNeed = activations(net,XTrain,'conv','OutputAs','channels');% conv层的特征

%%  画图
numNeed = 3   ;  %按需要取几张特征图
for i = 1:numNeed    
LayersFeature = reshape(cell2mat(LayersNeed(1,:)),18,24,32,[]); %根据analyzeNetwork分析结果,构造合适尺寸的特征图
axes1 = axes('Parent',figure);
hold(axes1,'on');
image(LayersFeature(:,:,i),'Parent',axes1,'CDataMapping','scaled');
colormap(hsv)
xlim([0, size(LayersFeature,2)]);% 限制坐标轴
ylim([0, size(LayersFeature,1)]);% 限制坐标轴
end

完整代码:https://mbd.pub/o/bread/ZZaWmJ9q

欢迎感兴趣的小伙伴关注并后台留言获取完整版代码哦~,小编会继续推送更有质量的学习资料、文章程序代码~

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐