1. 模型介绍
2 部分代码
clc; clear; close all;
%% ---------------------------- init Variabels ----------------------------
opt.Delays = 1:30;
opt.dataPreprocessMode = 'Data Standardization'; % 'None' 'Data Standardization' 'Data Normalization'
opt.learningMethod = 'LSTM';
opt.trPercentage = 0.80; % divide data into Test and Train dataset
% ---- General Deep Learning Parameters(LSTM and CNN General Parameters)
opt.maxEpochs = 400; % maximum number of training Epoch in deeplearning algorithms.
opt.miniBatchSize = 32; % minimum batch size in deeplearning algorithms .
opt.executionEnvironment = 'cpu'; % 'cpu' 'gpu' 'auto'
opt.LR = 'adam'; % 'sgdm' 'rmsprop' 'adam'
opt.trainingProgress = 'none'; % 'training-progress' 'none'
% ------------- BILSTM parameters
opt.isUseBiLSTMLayer = true; % if it is true the layer turn to the Bidirectional-LSTM and if it is false it will turn the units to the simple LSTM
opt.isUseDropoutLayer = true; % dropout layer avoid of bieng overfit
opt.DropoutValue = 0.5;
% ------------ Optimization Parameters
opt.optimVars = [
optimizableVariable('NumOfLayer',[1 4],'Type','integer')
optimizableVariable('NumOfUnits',[50 200],'Type','integer')
optimizableVariable('isUseBiLSTMLayer',[1 2],'Type','integer')
optimizableVariable('InitialLearnRate',[1e-2 1],'Transform','log')
optimizableVariable('L2Regularization',[1e-10 1e-2],'Transform','log')];
opt.isUseOptimizer = true;
opt.MaxOptimizationTime = 14*60*60;
opt.MaxItrationNumber = 60;
opt.isDispOptimizationLog = true;
opt.isSaveOptimizedValue = false; % save all of Optimization output on mat files
opt.isSaveBestOptimizedValue = true; % save Best Optimization output o丿 a mat file
%% --------------- load Data
data = loadData(opt);
if ~data.isDataRead
return;
end
%% --------------- Prepair Data
[opt,data] = PrepareData(opt,data);
%% --------------- Find Best LSTM Parameters with Bayesian Optimization
[opt,data] = OptimizeLSTM(opt,data);
%% --------------- Evaluate Data
[opt,data] = EvaluationData(opt,data);
%% ---------------------------- Local Functions ---------------------------
function data = loadData(opt)
[chosenfile,chosendirectory] = uigetfile({'*.xlsx';'*.csv'},...
'Select Excel time series Data sets','data.xlsx');
filePath = [chosendirectory chosenfile];
if filePath ~= 0
data.DataFileName = chosenfile;
data.CompleteData = readtable(filePath);
if size(data.CompleteData,2)>1
warning('Input data should be an excel file with only one column!');
disp('Operation Failed... '); pause(.9);
disp('Reloading data. '); pause(.9);
data.x = [];
data.isDataRead = false;
return;
end
data.seriesdataHeder = data.CompleteData.Properties.VariableNames(1,:);
data.seriesdata = table2array(data.CompleteData(:,:));
disp('Input data successfully read.');
data.isDataRead = true;
data.seriesdata = PreInput(data.seriesdata);
figure('Name','InputData','NumberTitle','off');
plot(data.seriesdata); grid minor;
title({['Mean = ' num2str(mean(data.seriesdata)) ', STD = ' num2str(std(data.seriesdata)) ];});
if strcmpi(opt.dataPreprocessMode,'None')
data.x = data.seriesdata;
elseif strcmpi(opt.dataPreprocessMode,'Data Normalization')
data.x = DataNormalization(data.seriesdata);
figure('Name','NormilizedInputData','NumberTitle','off');
plot(data.x); grid minor;
title({['Mean = ' num2str(mean(data.x)) ', STD = ' num2str(std(data.x)) ];});
elseif strcmpi(opt.dataPreprocessMode,'Data Standardization')
data.x = DataStandardization(data.seriesdata);
figure('Name','NormilizedInputData','NumberTitle','off');
plot(data.x); grid minor;
title({['Mean = ' num2str(mean(data.x)) ', STD = ' num2str(std(data.x)) ];});
end
else
warning(['In order to train network, please load data.' ...
'Input data should be an excel file with only one column!']);
disp('Operation Cancel.');
data.isDataRead = false;
end
end
function data = PreInput(data)
if iscell(data)
for i=1:size(data,1)
for j=1:size(data,2)
if strcmpi(data{i,j},'#NULL!')
tempVars(i,j) = NaN; %#ok
else
tempVars(i,j) = str2num(data{i,j}); %#ok
end
end
end
data = tempVars;
end
end
function vars = DataStandardization(data)
for i=1:size(data,2)
x.mu(1,i) = mean(data(:,i),'omitnan');
x.sig(1,i) = std (data(:,i),'omitnan');
vars(:,i) = (data(:,i) - x.mu(1,i))./ x.sig(1,i);
end
end
function vars = DataNormalization(data)
for i=1:size(data,2)
vars(:,i) = (data(:,i) -min(data(:,i)))./ (max(data(:,i))-min(data(:,i)));
end
end
% --------------- data preparation for LSTM ---
function [opt,data] = PrepareData(opt,data)
% prepare delays for time serie network
data = CreateTimeSeriesData(opt,data);
% divide data into test and train data
data = dataPartitioning(opt,data);
% LSTM data form
data = LSTMInput(data);
end
% ----Run Bayesian Optimization Hyperparameters for LSTM Network Parameters
function [opt,data] = OptimizeLSTM(opt,data)
if opt.isDispOptimizationLog
isLog = 2;
else
isLog = 0;
end
if opt.isUseOptimizer
opt.ObjFcn = ObjFcn(opt,data);
BayesObject = bayesopt(opt.ObjFcn,opt.optimVars, ...
'MaxTime',opt.MaxOptimizationTime, ...
'IsObjectiveDeterministic',false, ...
'MaxObjectiveEvaluations',opt.MaxItrationNumber,...
'Verbose',isLog,...
'UseParallel',false);
end
end
% ---------------- objective function
function ObjFcn = ObjFcn(opt,data)
ObjFcn = @CostFunction;
function [valError,cons,fileName] = CostFunction(optVars)
inputSize = size(data.X,1);
outputMode = 'last';
numResponses = 1;
dropoutVal = .5;
if optVars.isUseBiLSTMLayer == 2
optVars.isUseBiLSTMLayer = 0;
end
if opt.isUseDropoutLayer % if dropout layer is true
if optVars.NumOfLayer ==1
if optVars.isUseBiLSTMLayer
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
else
opt.layers = [ ...
sequenceInputLayer(inputSize)
lstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
end
elseif optVars.NumOfLayer==2
if optVars.isUseBiLSTMLayer
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
else
opt.layers = [ ...
sequenceInputLayer(inputSize)
lstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
lstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
end
elseif optVars.NumOfLayer ==3
if optVars.isUseBiLSTMLayer
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
else
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
end
elseif optVars.NumOfLayer==4
if optVars.isUseBiLSTMLayer
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
else
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
end
3 仿真结果
4 参考文献
[1]李万, 冯芬玲, 蒋琦玮. 改进粒子群算法优化LSTM神经网络的铁路客运量预测[J]. 铁道科学与工程学报, 2018, 15(12):260-266.
5 MATLAB代码与数据下载地址
见博客主页