colors = jet(num_trajectories);
for i = 0:(num_trajectories - 1)
phi = @(t) c * ones(size(t));
g = @(t, y, Z) par(1) * Z / (1 + Z^par(3)) - par(2) * y;
sol = dde23(@(t, y, Z) g(t, y, Z), tau, phi, [0 T]);
plot(sol.x, sol.y, 'Color', colors(i+1, :));
title('Mackey-Glass Equation Trajectories');
t = linspace(0, T, numTimeSteps);
X_delay=interp1(t,X,t-tau);
title('x vs. delayed term');
timesteps = (0:neuralOdeTimesteps)*dt;
tau = dlarray(tau_max*rand(1,nd));
sz = [hiddenSize nx*(1+nd)];
NDDE.fc1.Weights = initializeGlorot(sz);
NDDE.fc1.Bias = initializeZeros([sz(1) 1]);
sz = [hiddenSize hiddenSize];
NDDE.fc2.Weights = initializeGlorot(sz);
NDDE.fc2.Bias = initializeZeros([sz(1) 1]);
NDDE.fc3.Weights = initializeGlorot(sz);
tau = min(max(1e-5,tau),tau_max-1e-5);
monitor = trainingProgressMonitor(Metrics="Loss",Info=["Iteration","LearnRate"],XLabel="Iteration");
Error using matlab.internal.lang.capability.Capability.require
This functionality is not available on remote platforms.
Error in matlab.ui.internal.uifigureImpl (line 32)
Capability.require(Capability.WebWindow);
Error in uifigure (line 34)
window = matlab.ui.internal.uifigureImpl(varargin{:});
Error in deepmonitor.internal.DLTMonitorView/createGUIComponents (line 159)
this.Figure = uifigure("Tag", "DEEPMONITOR_UIFIGURE");
Error in deepmonitor.internal.DLTMonitorView (line 116)
this.createGUIComponents();
Error in deepmonitor.internal.DLTMonitorFactory/createStandaloneView (line 8)
view = deepmonitor.internal.DLTMonitorView(model, this);
Error in deep.TrainingProgressMonitor/set.Visible (line 175)
this.View = this.Factory.createStandaloneView(this.Model);
Error in trainingProgressMonitor (line 140)
monitor.Visible = args.Visible;
numTrainingTimesteps = numTimeSteps;
trainingTimesteps = 1:numTrainingTimesteps;
plottingTimesteps = 2:numTimeSteps;
while iteration < numIter && ~monitor.Stop
iteration = iteration + 1;
[X, targets] = createMiniBatch(numTrainingTimesteps, neuralOdeTimesteps, miniBatchSize, xTrain);
[loss,grad_par,grad_tau] = dlfeval(@modelLoss,timesteps,X,par,targets);
[par,averageGrad_p,averageSqGrad_p] = adamupdate(par,grad_par,averageGrad_p,averageSqGrad_p,iteration, learnRate,gradDecay,sqGradDecay);
[tau,averageGrad_t,averageSqGrad_t] = adamupdate(tau,grad_tau,averageGrad_t,averageSqGrad_t,iteration, learnRate,gradDecay,sqGradDecay);
recordMetrics(monitor,iteration,Loss=loss);
if mod(iteration,plotFrequency) == 0 || iteration == 1
y=dde23(fun,par,delay,hist,time);
plot(xTrain(1,plottingTimesteps),xTrain(2,plottingTimesteps),"r--")
title("Predicted vs. Real Dynamics")
legend("Training Ground Truth", "Predicted")
updateInfo(monitor,Iteration=iteration,LearnRate=learnRate);
monitor.Progress = 100*iteration/numIter;
function X = model(fun,par,delay,hist,time)
X = dde23(fun,par,delay,hist,time);
function dx=fun(t,y,Z,par)
dx = par.fc3.Weights*tanh(par.fc2.Weights*tanh(par.fc1.Weights*[y;Z]+par.fc1.Bias)+par.fc2.Bias);
function [loss,grad_par,grad_tau] = modelLoss(tspan,X0,par,targets)
X = model(fun,par,delay,hist,time);
loss = l1loss(X,targets);
grad_par = dlgradient(loss,par);
grad_tau = dlgradient(loss,tau);
function [x0, targets] = createMiniBatch(numTimesteps,numTimesPerObs,miniBatchSize,X)
s = randperm(numTimesteps - numTimesPerObs, miniBatchSize);
targets = zeros([size(X,1) miniBatchSize numTimesPerObs]);
targets( 1:numTimesPerObs,i) = X( s(i) + 1:(s(i) + numTimesPerObs),:);
function bias = initializeZeros(sz)
bias = zeros(sz,'single');
function weights = initializeGlorot(sz)
Z = 2*rand(sz,'single') - 1;
bound = sqrt(6 / (sz(2)+ sz(1)));
weights = dlarray(weights);