%%加入正则化 加入注意力机制 更改验证集和测试集 GRU加入TCN后
clear;close all;clc
%% 数据读取
data = xlsread('PV_1.xlsx');
%输入天数
Tian=100;
num_Tian = Tian*48;
train_ratio = 0.7; % 训练集比例
val_ratio = 0.15; % 验证集比例
test_ratio = 0.15; % 测试集比例
num_train =train_ratio * num_Tian;
num_val = val_ratio * num_Tian;
num_test = num_Tian - num_train - num_val;
%划分训练集验证集测试集
Tian_data=data(1:num_Tian,:);
Tian_train =Tian_data(1:num_train, :);
Tian_valid = Tian_data(num_train+1:num_train+num_val, :);
Tian_test= Tian_data(num_train+num_val+1:end, :);
lag = 1:96;
%读取影响因素和功率数据
shuru=Tian_data(:,1:4);%影响因素
shuchu=Tian_data(:,end);%功率
nn=1:size(shuru,1);%正常排序
shurugeshu = size(shuru,2)+max(lag);%输入特征个数
input_train =shuru(nn(1:num_train),:);input_train=input_train';
output_train=shuchu(nn(1:num_train),:);output_train=output_train';
input_valid =shuru(nn((num_train+1):num_train+num_val),:);input_valid=input_valid';
output_valid=shuchu(nn((num_train+1):num_train+num_val),:);output_valid=output_valid';
input_test=shuru(nn((num_train+num_val+1):end),:);input_test=input_test';
output_test=shuchu(nn((num_train+num_val+1):end),:);output_test=output_test';
%%训练集
[aa,bb]=mapminmax([input_train input_valid input_test]);
[cc,dd]=mapminmax([output_train output_valid output_test]);
[inputn,inputps]=mapminmax('apply',input_train,bb);
[outputn,outputps]=mapminmax('apply',output_train,dd);
tr_history= lagmatrix(outputn, lag);%错开历史数据
tr_history = tr_history(max(lag)+1:end,:)';%截取历史数据
tr_input = inputn(:,max(lag)+1:end);
tr_inputn = [tr_history;tr_input]; %按列(纵向)合并
tr_outputn = outputn(:,max(lag)+1:end);
%truetrain=mapminmax('reverse',tr_inputn,dd);%反归一化
Xxun{1} = tr_inputn; %训练集输入
Yxun{1} = tr_outputn; % 训练集输出
numChannel = 9; % 通道数量
KerSize = 3; % 卷积核大小
dropoutFactor = 0.005; % droupt
numChan = 4; % TCN残差块数
%%
layer = sequenceInputLayer(shurugeshu, 'Name', 'input'); % 输入层
lgraph = layerGraph(layer);
LayN = layer.Name; % 每层名字
% 循环遍历 numChan
for i = 1:numChan
KD = 2^(i-1); % 空洞系数、扩张系数
layers = [
convolution1dLayer(KerSize, numChannel, 'DilationFactor', KD, 'Padding', 'causal', 'Name', 'conv1_' + string(i)) % 卷积层
layerNormalizationLayer % 归一化层
spatialDropoutLayer(dropoutFactor) % 空间失活层
convolution1dLayer(KerSize, numChannel, 'DilationFactor', KD, 'Padding', 'causal') % 卷积层
layerNormalizationLayer % 归一化层
reluLayer % ReLU 激活函数层
spatialDropoutLayer(dropoutFactor) % 空间失活层
additionLayer(2, 'Name', 'add_' + string(i))]; % 加法层
% 添加层到网络
lgraph = addLayers(lgraph, layers);
% 连接层
lgraph = connectLayers(lgraph, LayN, 'conv1_' + string(i));
% 残差连接
if i == 1
layer = convolution1dLayer(1, numChannel, 'Name', 'convSkip');
lgraph = addLayers(lgraph, layer);
lgraph = connectLayers(lgraph, LayN, 'convSkip');
lgraph = connectLayers(lgraph, 'convSkip', 'add_' + string(i) + '/in2');
else
lgraph = connectLayers(lgraph, LayN, 'add_' + string(i) + '/in2');
end
% 更新 LayN
LayN = 'add_' + string(i);
end
% %%
% outputLayerName = 'add_' + string(numChan);
%
% % 查找匹配的层
% outputLayer = [];
% for i = 1:numel(lgraph.Layers)
% if strcmp(lgraph.Layers(i).Name, outputLayerName)
% outputLayer = lgraph.Layers(i);
% break;
% end
% end
% outputLayer.InputNames
% outputLayer.OutputNames
% 获取最后一层卷积层的输出
% outputLayerName =' add_' + string(numChan); % 最后一层卷积层的名称
% outputLayer = lgraph.Layers(find(strcmp({lgraph.Layers.Name}, outputLayerName)));
%
% % 读取最后一层卷积层的输出
% % output = activations(lgraph, inputData, outputLayer.Name);
% output = activations(lgraph, outputLayer.Name);
% outputLayer = convolution1dLayer(KerSize, numChannel, 'DilationFactor', KD, 'Padding', 'causal', 'Name', 'conv1_' + string(numChan));
%
% outputSize =outputLayer.OutputSize;
% outputIndex = outputLayer.Connections.EndIndex;
% outputSize = lgraph.Layers(outputIndex).OutputSize;
% % 获取输出对象
% output = outputLayer.OutputNames{1};
% output1 = outputLayer.OutputSize;
% size(output)
%%
% 添加 GRU 层
% gruLayer = gruLayer(hiddenSize, 'Name', 'gru');
gruLayer = gruLayer(3, 'Name', 'gru');
lgraph = addLayers(lgraph, gruLayer);
lgraph = connectLayers(lgraph, LayN, 'gru');
% 添加全连接层
layers = [
fullyConnectedLayer(1, 'Name', 'fc')
regressionLayer];
lgraph = addLayers(lgraph, layers);
lgraph = connectLayers(lgraph, 'gru', 'fc');
%设置权重衰减参数实现 L2 正则化
weightDecay = 0.001; % 正则化项权重
% 更新每个卷积层、GRU 层和全连接层的权重衰减参数
numLayers = numel(lgraph.Layers); %获取网络中层的数量
for i = 1:numLayers
layer = lgraph.Layers(i);
if isa(layer, 'CausalConvolution1DLayer') || isa(layer, 'nnet.cnn.layer.FullyConnectedLayer') %检查当前层是否为因果卷积层、GRU 层或全连接层。如果是,则执行以下操作
layer.WeightLearnRateFactor = 1;
layer.WeightL2Factor = weightDecay;
end
end
% 设置训练参数
options = trainingOptions('adam', ...
'MaxEpochs', 800, ...
'InitialLearnRate', 0.02, ...
'Plots', 'training-progress', ...
'Verbose', 0);
% 进行训练
net = trainNetwork(Xxun, Yxun, lgraph, options);
%% 画图
%网络图
analyzeNetwork(net)
%% 验证集输入
%验证集样本输入输出数据归一化
val_input=mapminmax('apply',input_valid,bb);
val_output=mapminmax('apply',output_valid,dd);
val_history= lagmatrix(val_output, lag); %历史功率
val_history = val_history(max(lag)+1:end,:)';
val_input = val_input(:,max(lag)+1:end); %影响因素
val_inputn = [val_history;val_input]; %按列(纵向)合并
val_outputn = output_valid(:,max(lag)+1:end);
xvalid{1} = val_inputn;
an = predict(net,xvalid);
anx=an{1};
val_pre=mapminmax('reverse',anx,dd);%反归一化
%%
% 验证集结果
reay = val_outputn; % 真实数据
prey = val_pre; % 仿真数据
reay = reshape(reay,1,size(reay,1)*size(reay,2)); % 真实数据
prey = reshape(prey,1,size(prey,1)*size(prey,2)); % 仿真数据
Tian_num=length(reay);%统计样本总数
error=prey-reay; %计算误差
MAE=sum(abs(error))/Tian_num; %计算平均绝对误差
MSE=sum(error.*error)/Tian_num; %计算均方误差
RMSE=sqrt(MSE); %计算均方误差根
ME=sum((error))/Tian_num; %计算平均绝对误差
r=min(min(corrcoef(prey,reay)));
R2=r*r;
disp('整体验证集')
disp('--------------------------------------------')
disp(['平均绝对误差MAE为: ',num2str(MAE)])
disp(['均方误差根MSE为: ',num2str(MSE)])
disp(['均方误差根RMSE为: ',num2str(RMSE)])
disp(['平均误差ME为: ',num2str(ME)])
disp(['相关系数R2为: ',num2str(R2)])
%验证集画图
figure
plot(val_outputn )
hold on
plot(val_pre )
legend('真实值','预测值')
title('验证集')
%% 测试集输入
%验证集样本输入输出数据归一化
test_input=mapminmax('apply',input_test,bb);
test_output=mapminmax('apply',output_test,dd);
test_history= lagmatrix(test_output, lag); %历史功率
test_history = test_history(max(lag)+1:end,:)';
test_input = test_input(:,max(lag)+1:end); %影响因素
test_inputn = [test_history;test_input]; %按列(纵向)合并
test_outputn = output_test(:,max(lag)+1:end);
xtest{1} = test_
没有合适的资源?快使用搜索试试~ 我知道了~
基于时间卷积神经网络结合门控循环单元的(TCN-GRU)的回归预测预测,多变量输入模型(Matlab完整源码和数据)
共4个文件
m:3个
xlsx:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 2 下载量 157 浏览量
2023-07-01
18:24:56
上传
评论 2
收藏 647KB ZIP 举报
温馨提示
基于时间卷积神经网络结合门控循环单元的(TCN-GRU)的回归预测预测,多变量输入模型(Matlab完整源码和数据) 基于时间卷积神经网络结合门控循环单元的(TCN-GRU)的回归预测预测,多变量输入模型(Matlab完整源码和数据) 运行环境Matlab2021b及以上。 输入影响因素,输出功率数据。 整体验证集 -------------------------------------------- 平均绝对误差MAE为: 9.7974 均方误差根MSE为: 202.7106 均方误差根RMSE为: 14.2376 平均误差ME为: -3.5596 相关系数R2为: 0.95007 测试集中一天的效果 ---------------------------------------------------------- 平均绝对误差MAE为: 14.7932 均方误差根MSE为: 283.5843 均方误差
资源推荐
资源详情
资源评论
收起资源包目录
TCN-GRU.zip (4个子文件)
PV_1.xlsx 646KB
spatialDropoutLayer.m 1KB
TCNGRU.m 10KB
quanRegressionLayer.m 1KB
共 4 条
- 1
资源评论
- qq_403750752023-12-14实在是宝藏资源、宝藏分享者!感谢大佬~
- m0_676056042023-12-30资源很实用,内容详细,值得借鉴的内容很多,感谢分享。
前程算法屋
- 粉丝: 4155
- 资源: 710
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功