当前位置:   article > 正文

2021-08-10_lstm隐含层节点个数如何确定

lstm隐含层节点个数如何确定


前言

新手小白,想用LSTM做模型,参考了这篇文章参考来源


温度、湿度、日照时间等都会对蒸散发产生影响,想基于此构造LSTM模型,输入为当日温度、湿度、日照时间等,输出为当日蒸散发。

一、数据预处理

收集了一个区域内若干个气象站1960年-2020年的气候数据,用PM公式算出了参考蒸散发。先用一个观测站的数据来跑一下模型。用除去2020年的数据进行训练,2020年的数据进行验证。

clear;
clc;
data = importdata('data.txt')
[num11,num1] = size(data);
num2 = num11-365;

%加载数据,重构为行向量
IN_train = data((2:num2),1:8)';
OUT_train = data((2:num2),9)'; %9行为ET

% 测试集――365个样本
IN_test = data((num2+1:end),1:8)';
OUT_test = data((num2+1:end),9)';
N = size(IN_test,2);
[in_train, ps_input] = mapminmax(IN_train,0,1);
in_test = mapminmax('apply',IN_test,ps_input);
[out_train, ps_output] = mapminmax(OUT_train,0,1);

xvalidation = in_train(:,num2-1000:end);
in_train = in_train(:,1:num2-1001);
yvalidation = out_train(:,num2-1000:end);
out_train=out_train(:,1:num2-1001);
rng('default')%设置随机种子
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

二、网络构造

代码如下:

%创建LSTM回归网络,指定LSTM层的隐含单元个数200
numFeatures = size(in_train,1);
numResponses = 1;
numHiddenUnits =200;
 
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(numResponses)
    regressionLayer];
 
%指定训练选项,求解器设置为adam, 100 轮训练。
%梯度阈值设置为 1。指定初始学习率 0.005,在 10 轮训练后通过乘以因子 0.2 来降低学习率。

options = trainingOptions('adam', ...
    'MaxEpochs',100, ...
    'GradientThreshold',1, ...
    'InitialLearnRate',0.01, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropPeriod',55, ...
    'ValidationData',{xvalidation,yvalidation}, ...
    'ValidationFrequency',10, ...
    'LearnRateDropFactor',0.2, ...
    'Verbose',0, ...
    'Plots','training-progress');
%训练LSTM
net = trainNetwork(in_train,out_train,layers,options);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

三、数据预测

代码如下:

net = resetState(net);
net = predictAndUpdateState(net,in_train);
YPred = predict(net,in_test,'MiniBatchSize',1);
% 数据反归一化
T_sim = mapminmax('reverse',YPred,ps_output);


% 1. 相对绝对误差MAE
mae = sum(abs(T_sim - OUT_test))./N;
% 2.均方根误差RMSE
rmse = sqrt(sum((T_sim - OUT_test).^2)./N);

% 3. 相关系数R
R = sqrt((N * sum(T_sim .* OUT_test) - sum(T_sim) * sum(OUT_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((OUT_test).^2) - (sum(OUT_test))^2))); 
%%
% 4. 结果对比
result = [OUT_test' T_sim']
%%  绘图
figure
plot(1:N,OUT_test,'b',1:N,T_sim,'r')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('真实值')
string = {'LSTM预测结果对比';['R=' num2str(R)]};
title(string)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

四、结果

预测的结果如下(纵轴处理过,单位不是mm)

在这里插入图片描述


总结

借鉴了博主”左儿筱羽“的代码。 结果还不错,后续还要根据情况继续改进一下。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/314352
推荐阅读
相关标签
  

闽ICP备14008679号