Hi,
I am looking into Flux and trying to understand the recurrent functionality. The following code defines a first order low pass filter with Flux.Recur
.
using Flux
using Flux.Tracker
c = 0.5
function LP(h, x)
h = c * x + (1.0 - c) * h
return h, h
end
h = 0.
recurLP = Flux.Recur(LP, h)
function model(x)
out = zeros(1000,1)
for ii = 1:1000
out[ii] = recurLP(x[ii])
end
return out
end
function loss(x, y)
return sum((model(x) .- y).^2)
end
Let’s filter some noise and calculate the loss.
inp = randn(1000,1);
loss(inp, inp)
317.4691466179187
It seems that the filter is filtering something
So far so good, now we could optimize the filter coefficient, such that the filter stops filtering, e.g. for c = 1.0
the loss should become 0.
However, neither:
Flux.train!(loss, params(model), [(inp, inp)], ADAM(0.1))
nor
c = param(c)
gs = Tracker.gradient(() -> loss(inp, inp), params(c))
seem to work.
I get error messages
MethodError: no method matching back!(::Float64)
and
MethodError: no method matching Float64(::Tracker.TrackedReal{Float64})
, respectively.
What am I missing?
Thanks in advance