"RecordingArrays cannot be used across tapes" when backpropagating dlode45

3 ビュー (過去 30 日間)
Bowei Li
Bowei Li 2022 年 7 月 15 日
Hi! The program works well but throws error "RecordingArrays cannot be used across tapes" from dlgradient when I added 'GradientMode="adjoint"' to dlode45,
Error using deep.internal.recording.RecordingArray/recordBinary
RecordingArrays cannot be used across tapes.
Error in deep.internal.recording.RecordingArray/permute (line 13)
x = recordBinary(x,order,op);
Error in dlarray/interp1>iGetDataV (line 131)
dataV = permute(dataV, viewToData);
Error in dlarray/interp1 (line 62)
[dataV, dimsV] = iGetDataV(v, isvector(xq));
Error in NeuralODE_Lstm_WindEppFiber_red_v2_adjGrad>odeModel (line 1344)
F_t = interp1(t_ref, F, t)'; % Current excitation
Error in NeuralODE_Lstm_WindEppFiber_red_v2_adjGrad>@(t,y,theta)odeModel(t,y,theta,F,tspan) (line 1322)
X_i = dlode45(@(t, y, theta) odeModel(t, y, theta, F, tspan), tspan, X0, neuralOdeParameters, DataFormat="CB", GradientMode="adjoint");
Error in internal_dlodeBackward>iComputeBatchedAugRightHandSide (line 141)
f = dlodefun(t,z,theta);
Error in deep.AcceleratedFunction/parenReference (line 255)
[varargout{1:nargout}] = obj.Function(inputs{:});
Error in deep.internal.fevalWithNewTape (line 21)
[varargout{1:nargout}] = fun(varargin{:});
Error in internal_dlodeBackward>augDynamicsRightHandSide (line 113)
[f, adf_dz, adf_dtheta] = deep.internal.fevalWithNewTape(gradientFcn,...
Error in internal_dlodeBackward>@(t,s)augDynamicsRightHandSide(t,s,originalTheta,dlodefun,yStateSize,numObs,originalSize,originalFormat,numLearnables,gradientBatchFcn) (line 44)
augDynamics = @(t,s) augDynamicsRightHandSide(t,s,originalTheta,dlodefun,yStateSize,...
Error in internal_dlodeBackward (line 63)
f0 = augDynamics(initialTime,augState);
Error in deep.internal.recording.operations.DlodeOp/backward (line 81)
[outputs{:}] = internal_dlodeBackward(dy,y,op.Y0Format,op.Odefun,tspan,op.Options,...
Error in deep.internal.recording.RecordingArray/backwardPass (line 89)
grad = backwardTape(tm,{y},{initialAdjoint},x,retainData,false,0);
Error in dlarray/dlgradient (line 132)
[grad,isTracedGrad] = backwardPass(y,xc,pvpairs{:});
Error in NeuralODE_Lstm_WindEppFiber_red_v2_adjGrad>modelGradients (line 1334)
gradients = dlgradient(loss, neuralOdeParameters);
Error in deep.internal.dlfeval (line 17)
[varargout{1:nargout}] = fun(x{:});
Error in dlfeval (line 40)
[varargout{1:nargout}] = deep.internal.dlfeval(fun,varargin{:});
Error in NeuralODE_Lstm_WindEppFiber_red_v2_adjGrad (line 486)
[gradients, loss, X_i] = dlfeval(@modelGradients, t, XTrain_Tr, index_batch, neuralOdeParameters, YTrain_Tr, U_Peak_mean);
Here is the odeModel:
function y = odeModel(t, y, theta, F, t_ref)
% Inputs:
% t = time
% y = state vector
% theta = parameters
% F = excitation
% t_ref = time points of the excitation
F_t = interp1(t_ref, F, t)'; % Current input signal, interpolate to find the signal value at t
y = tanh(theta.fc1.Weights*y + theta.fc1.Bias);
y = tanh(theta.fc2.Weights*y + theta.fc2.Bias) + theta.fc3.Weights*F_t;
And looks like the error is within "interp1". However, even I tried to replace the "interp1" by the following lines of code the error presists.
t_left = t_ref(t_ref<=t); F_left = F(t_ref<=t,:);
t_right = t_ref(t_ref>t); F_right = F(t_ref>t,:);
t1 = t_left(end);
if isempty(t_right)
F2 = F_right(1,:)';
F1 = F_left(end,:)';
F_t = (F1*(t2-t) + F2*(t-t1))/(t2-t1);
Thanks in advance!

回答 (0 件)


Help Center および File ExchangeParticle & Nuclear Physics についてさらに検索




Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by