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)
[1]马梓程. 基于贝叶斯优化的LSTM模型在动力电池SoC估算中的应用[D]. 江苏大学.
[2]司阳, 肖秦琨. 基于长短时记忆和动态贝叶斯网络的序列预测[J]. 计算机技术与发展, 2018, 28(009):59-63.