# Optimizing parameters of ODE in DiffEqFlux: Not implemented: convert tracked Tracker.TrackedReal{Float64} to tracked Float64

**URL:** <https://discourse.julialang.org/t/optimizing-parameters-of-ode-in-diffeqflux-not-implemented-convert-tracked-tracker-trackedreal-float64-to-tracked-float64/22560>\
**Category:** Machine Learning\
**Tags:** diffeq, flux, optimization\
**Created:** [March 31, 2019, 5:47am UTC](https://discourse.julialang.org/t/optimizing-parameters-of-ode-in-diffeqflux-not-implemented-convert-tracked-tracker-trackedreal-float64-to-tracked-float64/22560 "2019-03-31T05:47:20Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mzhenirovskyy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mzhenirovskyy/32/7549_2.png) [@mzhenirovskyy](https://discourse.julialang.org/u/mzhenirovskyy)\
**Post date:** [March 31, 2019, 5:47am UTC](https://discourse.julialang.org/t/optimizing-parameters-of-ode-in-diffeqflux-not-implemented-convert-tracked-tracker-trackedreal-float64-to-tracked-float64/22560/1 "2019-03-31T05:47:20Z")

</div>

My model:

```julia
using Random
using Flux, DiffEqFlux, DifferentialEquations

function model(dZ, Z, params, t)

    W0 = reshape(params[1:12], (1, 12))
    b0 = reshape(params[13:24], (1, 12))
    W1 = reshape(params[25:36], (12, 1))
    b1 = params[end]

    N = Integer(length(Z) / 4);

    X = Z[1:N];
    Y = Z[N + 1:2 * N];
    Vx = Z[2 * N + 1:3 * N];
    Vy = Z[3 * N + 1:4 * N];

    Vxdiff = broadcast(-, Vx, Vx');
    Vydiff = broadcast(-, Vy, Vy');
    Xdiff = broadcast(-, X, X');
    Ydiff = broadcast(-, Y, Y');

    R2 = Xdiff.^2 + Ydiff.^2;

    r = reshape(R2, (N * N, :))
    X0 = r * W0 .+ b0
    Z0 = max.(X0, 0)  
    X1 = Z0 * W1 .+ b1
    RR = reshape(X1, (N, N))

    dVx = -sum(Vxdiff .* RR, dims = 2) ./ N
    dVy = -sum(Vydiff .* RR, dims = 2) ./ N;

    dZ[:] = [reshape(Vx, (N, 1)); reshape(Vy, (N, 1)); dVx; dVy] # ERROR LINE
end;

t = collect(0:0.1:10)

u0 = rand(20, 1)
tspan = (0.0, 1.0)
p_nominal = rand(37, 1);

prob = ODEProblem(model, u0, tspan, p_nominal)
data_sol = solve(prob, Tsit5(), saveat = 0.1)

p = rand(37, 1);
p = param(p)

function predict_rd()
    diffeq_rd(p, prob, Tsit5(), saveat = 0.1)
end

loss_rd() = sum(abs2, predict_rd() - data_sol);
print(loss_rd());

```

My error is

```julia
ERROR: LoadError: Not implemented: convert tracked Tracker.TrackedReal{Float64} to tracked Float64
Stacktrace:
 [1] error(::String) at .\error.jl:33
 [2] convert(::Type{Tracker.TrackedReal{Float64}}, ::Tracker.TrackedReal{Tracker.TrackedReal{Float64}}) at C:\Users\.julia\packages\Tracker\6wcYJ\src\lib\real.jl:39
 [3] setindex!(::Array{Tracker.TrackedReal{Float64},2}, ::Tracker.TrackedReal{Tracker.TrackedReal{Float64}}, ::Int64) at .\array.jl:767
 [4] macro expansion at .\multidimensional.jl:701 [inlined]
 [5] macro expansion at .\cartesian.jl:64 [inlined]
 [6] macro expansion at .\multidimensional.jl:696 [inlined]
 [7] _unsafe_setindex! at .\multidimensional.jl:689 [inlined]
 [8] _setindex! at .\multidimensional.jl:684 [inlined]
 [9] setindex! at .\abstractarray.jl:1020 [inlined]
 [10] model(::Array{Tracker.TrackedReal{Float64},2}, ::Array{Tracker.TrackedReal{Float64},2}, ::TrackedArray{…,Array{Float64,2}}, ::Float64) at d:\question\run.jl:34
 [11] ODEFunction at C:\Users\mzhen\.julia\packages\DiffEqBase\ZQVwI\src\diffeqfunction.jl:107 [inlined]
...

```

So the problem is here:

```julia
dZ[:] = [reshape(Vx, (N, 1)); reshape(Vy, (N, 1)); dVx; dVy]

```

How can I update dZ to avoid an error?

Thanks!

---

<div class="post-metadata">

**Author:** ![JackDevine](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jackdevine/32/1048_2.png) [@JackDevine](https://discourse.julialang.org/u/JackDevine)\
**Post date:** [March 31, 2019, 9:06am UTC](https://discourse.julialang.org/t/optimizing-parameters-of-ode-in-diffeqflux-not-implemented-convert-tracked-tracker-trackedreal-float64-to-tracked-float64/22560/2 "2019-03-31T09:06:28Z")

</div>

For me, changing the line to

```julia
dZ .= [reshape(Vx, (N, 1)); reshape(Vy, (N, 1)); dVx; dVy] |> collect

```

Seems to fix the problem.

Also, as a side note, you don’t need to use semicolons to end lines in julia.

---

<div class="post-metadata">

**Author:** ![JackDevine](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jackdevine/32/1048_2.png) [@JackDevine](https://discourse.julialang.org/u/JackDevine)\
**Post date:** [March 31, 2019, 9:28am UTC](https://discourse.julialang.org/t/optimizing-parameters-of-ode-in-diffeqflux-not-implemented-convert-tracked-tracker-trackedreal-float64-to-tracked-float64/22560/3 "2019-03-31T09:28:27Z")

</div>

I made some more changes so that your model will actually train. I tried to make comments every time that I made a change, but I may have missed a few. You might like to go through carefully and see what all of the changes are.

```julia
using Random
using Flux, DiffEqFlux, DifferentialEquations

function model(dZ, Z, params, t)

    W0 = reshape(params[1:12], (1, 12))
    b0 = reshape(params[13:24], (1, 12))
    W1 = reshape(params[25:36], (12, 1))
    b1 = [params[end]] # If this is not an array, then training does not work for some reason.

    N = Integer(length(Z) / 4)

    X = Z[1:N];
    Y = Z[N + 1:2 * N];
    Vx = Z[2 * N + 1:3 * N];
    Vy = Z[3 * N + 1:4 * N];

    Vxdiff = broadcast(-, Vx, Vx');
    Vydiff = broadcast(-, Vy, Vy');
    Xdiff = broadcast(-, X, X');
    Ydiff = broadcast(-, Y, Y');

    R2 = Xdiff.^2 + Ydiff.^2;

    r = reshape(R2, (N * N, :))
    X0 = r * W0 .+ b0
    Z0 = max.(X0, 0)
    X1 = Z0 * W1 .+ b1
    RR = reshape(X1, (N, N))

    dVx = -sum(Vxdiff .* RR, dims = 2) ./ N
    dVy = -sum(Vydiff .* RR, dims = 2) ./ N;

    dZ .= [reshape(Vx, (N, 1)); reshape(Vy, (N, 1)); dVx; dVy] |> collect # ERROR LINE
end

t = collect(0:0.1:10)

u0 = rand(20, 1)
tspan = (0.0, 1.0)
p_nominal = rand(37, 1)

prob = ODEProblem(model, u0, tspan, p_nominal)
data_sol = solve(prob, Tsit5(), saveat = 0.1)

p = rand(37, 1)
p = param(p)

function predict_rd()
    diffeq_rd(p, prob, Tsit5(), saveat = 0.1)
end

loss_rd() = sum(abs2, predict_rd() .- data_sol) # Use .- here.
println(loss_rd())

params = Flux.Params([p])
opt = ADAM()
data = Iterators.repeated((), 20)
cb = () -> display(loss_rd())
Flux.train!(loss_rd, params, data, opt, cb=cb)

```

---

<div class="post-metadata">

**Author:** ![mzhenirovskyy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mzhenirovskyy/32/7549_2.png) [@mzhenirovskyy](https://discourse.julialang.org/u/mzhenirovskyy)\
**Post date:** [March 31, 2019, 4:52pm UTC](https://discourse.julialang.org/t/optimizing-parameters-of-ode-in-diffeqflux-not-implemented-convert-tracked-tracker-trackedreal-float64-to-tracked-float64/22560/4 "2019-03-31T16:52:52Z")

</div>

Thank, you, @JackDevine very much.  
It works!

One question is not clear to me…

```julia
a = [1.0, 2, 3]
b = [4, 5, 6]
x1 = zeros(6)
x2 = zeros(6)
x3 = zeros(6)

x1[:] = [a; b] # Doesn't work with DiffEqFlux
x2[:] = vcat(a, b) # Doesn't work with DiffEqFlux
x3 .= [a; b] |> collect # Works with DiffEqFlux

println(x1 == x3)
println(x2 == x3)

```

Why can I use “|\>” but can’t use “vcat(a, b)” or “[a; b]”? It looks like x1==x2==x3.

---

<div class="post-metadata">

**Author:** ![JackDevine](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jackdevine/32/1048_2.png) [@JackDevine](https://discourse.julialang.org/u/JackDevine)\
**Post date:** [March 31, 2019, 8:33pm UTC](https://discourse.julialang.org/t/optimizing-parameters-of-ode-in-diffeqflux-not-implemented-convert-tracked-tracker-trackedreal-float64-to-tracked-float64/22560/5 "2019-03-31T20:33:58Z")

</div>

I think that the last comment in this issue might help you understand

> <https://github.com/FluxML/Flux.jl/issues/256>
>
> I'm trying to recreate this PyTorch RNN tutorial https://www.cpuheater.com/deep-…learning/introduction-to-recurrent-neural-networks-in-pytorch/ (initially without any of the more advanced RNN features in Flux just to get an idea of translation issues from PyTorch). When I try to run it, I get:
> 
> \> ERROR: LoadError: MethodError: Cannot \`convert\` an object of type Flux.Tracker.TrackedReal{Float64} to an object of type Float64
> \> This may have arisen from a call to the constructor Float64(...),
> \> since type constructors fall back to convert methods.
> \> Stacktrace:
> \> \[1\] setindex! at ./multidimensional.jl:300 \[inlined\]
> \> \[2\] macro expansion at ./broadcast.jl:156 \[inlined\]
> \> \[3\] macro expansion at ./simdloop.jl:73 \[inlined\]
> \> \[4\] macro expansion at ./broadcast.jl:149 \[inlined\]
> \> \[5\] \_broadcast! at ./broadcast.jl:141 \[inlined\]
> \> \[6\] broadcast\_c! at ./broadcast.jl:213 \[inlined\]
> \> \[7\] broadcast! at ./broadcast.jl:206 \[inlined\]
> \> \[8\] accum!(::Array{Float64,2}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:29
> \> \[9\] back(::Flux.Tracker.Tracked{Array{Float64,2}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:32
> \> \[10\] macro expansion at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:49 \[inlined\]
> \> \[11\] back(::Base.#\*, ::Array{Flux.Tracker.TrackedReal{Float64},2}, ::Array{Flux.Tracker.TrackedReal{Float64},2}, ::TrackedArray{…,Array{Float64,2}}) at /home/phil/.julia/v0.6/Flux/src/tracker/array.jl:280
> \> \[12\] back\_(::Flux.Tracker.Call{Base.#\*,Tuple{Array{Flux.Tracker.TrackedReal{Float64},2},TrackedArray{…,Array{Float64,2}}}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:25
> \> \[13\] back(::Flux.Tracker.Tracked{Array{Flux.Tracker.TrackedReal{Float64},2}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:38
> \> \[14\] macro expansion at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:49 \[inlined\]
> \> \[15\] (::Flux.Tracker.##56#58)(::TrackedArray{…,Array{Flux.Tracker.TrackedReal{Float64},2}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/array.jl:385
> \> \[16\] foreach(::Function, ::Tuple{TrackedArray{…,Array{Flux.Tracker.TrackedReal{Float64},2}}}, ::Tuple{Array{Flux.Tracker.TrackedReal{Float64},2}}, ::Vararg{Tuple{Array{Flux.Tracker.TrackedReal{Float64},2}},N} where N) at ./abstractarray.jl:1734
> \> \[17\] back\_(::Flux.Tracker.Call{Flux.Tracker.Broadcasted{Base.#tanh,Array{ForwardDiff.Dual{Void,Flux.Tracker.TrackedReal{Float64},1},2}},Tuple{TrackedArray{…,Array{Flux.Tracker.TrackedReal{Float64},2}}}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:25
> \> \[18\] back(::Flux.Tracker.Tracked{Array{Flux.Tracker.TrackedReal{Float64},2}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:38
> \> \[19\] macro expansion at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:49 \[inlined\]
> \> \[20\] back(::Base.#\*, ::Array{Flux.Tracker.TrackedReal{Float64},2}, ::TrackedArray{…,Array{Flux.Tracker.TrackedReal{Float64},2}}, ::TrackedArray{…,Array{Float64,2}}) at /home/phil/.julia/v0.6/Flux/src/tracker/array.jl:279
> \> \[21\] back\_(::Flux.Tracker.Call{Base.#\*,Tuple{TrackedArray{…,Array{Flux.Tracker.TrackedReal{Float64},2}},TrackedArray{…,Array{Float64,2}}}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:25
> \> \[22\] back(::Flux.Tracker.Tracked{Array{Flux.Tracker.TrackedReal{Float64},2}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:38
> \> \[23\] macro expansion at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:49 \[inlined\]
> \> \[24\] (::Flux.Tracker.##56#58)(::TrackedArray{…,Array{Flux.Tracker.TrackedReal{Float64},2}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/array.jl:385
> \> \[25\] foreach(::Function, ::Tuple{TrackedArray{…,Array{Flux.Tracker.TrackedReal{Float64},2}},Float64}, ::Tuple{Array{Flux.Tracker.TrackedReal{Float64},2},Array{Flux.Tracker.TrackedReal{Float64},2}}, ::Vararg{Tuple{Array{Flux.Tracker.TrackedReal{Float64},2},Array{Flux.Tracker.TrackedReal{Float64},2}},N} where N) at ./abstractarray.jl:1734
> \> \[26\] back\_(::Flux.Tracker.Call{Flux.Tracker.Broadcasted{##1#4,Array{ForwardDiff.Dual{Void,Flux.Tracker.TrackedReal{Float64},2},2}},Tuple{TrackedArray{…,Array{Flux.Tracker.TrackedReal{Float64},2}},Float64}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:25
> \> \[27\] back(::Flux.Tracker.Tracked{Array{Flux.Tracker.TrackedReal{Float64},2}}, ::Array{Flux.Tracker.TrackedReal{Float64},2}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:38
> \> \[28\] back(::Base.#sum, ::Flux.Tracker.TrackedReal{Float64}, ::TrackedArray{…,Array{Flux.Tracker.TrackedReal{Float64},2}}) at /home/phil/.julia/v0.6/Flux/src/tracker/array.jl:190
> \> \[29\] back\_(::Flux.Tracker.Call{Base.#sum,Tuple{TrackedArray{…,Array{Flux.Tracker.TrackedReal{Float64},2}}}}, ::Flux.Tracker.TrackedReal{Float64}, ::Flux.Tracker.TrackedReal{Float64}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:25
> \> \[30\] back(::Flux.Tracker.Tracked{Flux.Tracker.TrackedReal{Float64}}, ::Flux.Tracker.TrackedReal{Float64}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:36
> \> \[31\] macro expansion at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:49 \[inlined\]
> \> \[32\] back(::Base.#/, ::Flux.Tracker.TrackedReal{Float64}, ::Flux.Tracker.TrackedReal{Flux.Tracker.TrackedReal{Float64}}, ::Int64) at /home/phil/.julia/v0.6/Flux/src/tracker/scalar.jl:58
> \> \[33\] back\_(::Flux.Tracker.Call{Base.#/,Tuple{Flux.Tracker.TrackedReal{Flux.Tracker.TrackedReal{Float64}},Int64}}, ::Flux.Tracker.TrackedReal{Float64}, ::Flux.Tracker.TrackedReal{Float64}) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:25
> \> \[34\] back(::Flux.Tracker.Tracked{Flux.Tracker.TrackedReal{Float64}}, ::Int64) at /home/phil/.julia/v0.6/Flux/src/tracker/back.jl:36
> \> \[35\] back!(::Flux.Tracker.TrackedReal{Flux.Tracker.TrackedReal{Float64}}) at /home/phil/.julia/v0.6/Flux/src/tracker/scalar.jl:11
> \> \[36\] train() at /home/phil/devel/ML/PyTorch/pytorch\_examples/elman\_rnn/Elman\_RNN.jl:46
> \> \[37\] include\_from\_node1(::String) at ./loading.jl:576
> \> \[38\] include(::String) at ./sysimg.jl:14
> \> while loading /home/phil/devel/ML/PyTorch/pytorch\_examples/elman\_rnn/Elman\_RNN.jl, in expression starting on line 59
> 
> My Code:
> \`\`\`
> using Flux
> using Flux.Tracker
> 
> input\_size, hidden\_size, output\_size = 7, 6, 1
> epochs = 200
> seq\_length = 20
> lr = 0.1
> 
> data\_time\_steps = linspace(2,10, seq\_length+1)
> data = sin.(data\_time\_steps)
> 
> x = data\[1:end-1\]
> y = data\[2:end\]
> 
> w1 = param(randn(input\_size, hidden\_size))
> w2 = param(randn(hidden\_size, output\_size)) 
> 
> function forward(input, context\_state, W1, W2)
> xh = cat(2,input, context\_state) 
> context\_state = tanh.(xh\*W1)
> out = context\_state\*W2
> return out, context\_state
> end
> 
> \#context\_state = zeros(hidden\_size)
> predictions = \[\]  
> 
> function train() 
> for i in 1:epochs
> print("Epoch $i\\n")
> total\_loss = 0
> context\_state = zeros(1,hidden\_size)
> for j in 1:length(x)
> print(" j = $j\\n")
> input = x\[j\]
> print("input (x\[$j\]) is: $input\\n")
> target= y\[j\]
> print("target (y\[$j\]) is: $target\\n")
> pred, context\_state = forward(input, context\_state, w1, w2)
> print("pred: $pred\\n")
> print("target: $target\\n")
> flush(STDOUT)
> loss = sum((pred .- target).^2)/2
> print("loss is: $loss\\n")
> total\_loss += loss
> back!(loss)
> w1.data .-= lr.\*w1.grad
> w2.data .-= lr.\*w2.grad
> 
> w1.grad .= 0.0
> w2.grad .= 0.0 
> end
> if(i % 10 == 0)
> println("Epoch: $i loss: $total\_loss")
> end
> end
> end
> train()
> \`\`\`

So actually, the recommended way would be to use `Tracker.collect`. I am not a julia AD internals expert, so with any luck somebody who knows more will chime in.
