Stacking layers example Flux - Flux.params empty

Hi,

I used the following example of the Flux documentation and when I execute the code the parameters are empty.

``````using Flux

struct Affine
W
b
end

Affine(in::Integer, out::Integer) =
Affine(randn(out, in), randn(out))

# Overload call, so the object can be used as a function
(m::Affine)(x) = m.W * x .+ m.b

a = Affine(10, 5)

a(rand(10)) # => 5-element vector

layers = [Dense(10, 5, σ), Dense(5, 2), softmax]

model(x) = foldl((x, m) -> m(x), layers, init = x)

model(rand(10)) # => 2-element vector

ps = Flux.params(model)
``````

And when I use

``````model2 = Chain(
Dense(10, 5, σ),
Dense(5, 2),
softmax)
``````

not, but I think I need the parameter to call `Flux.train!(loss, ps, data, opt)`. Can somebody tell me, what I´m doing wrong?

Best regards

1 Like

I suppose you are talking about `Flux.params`. Your model structure needs to implement the `Flux.functor` function for `params` to work (`Chain` implements it).

I don’t know how to do that for `model` in the example above as it closes over layers, but as a workaround, you should be able to get the parameters by calling `params(layers)`.

If you want `params(model)` to work then an easy way is to define a struct which has `layers` as a member and which does the foldl thingy when called as a function. Then you can just put `Flux.@functor Model` (where `Model` is your model struct) and Flux will create the function for you.

My intention is to create the models through lists with strings

``````if layer_types[1] == "dense"
layers = [Dense(size(data[1], 2), no_neurons[1], list_activations[1])]
else layer_types[1] == "lstm"
layers = [LSTM(size(data[1], 2), no_neurons[1])]
end

for i in 2:length(layer_types)
if layer_types[i] == "dense"
push!(layers, Dense(no_neurons[i-1], no_neurons[i], list_activations[i]))
else layer_types[i] == "lstm"
push!(layers, LSTM(no_neurons[i-1], no_neurons[i]))
end
end

model = Chain(layers)
``````

So that i.e. you can train several different models in one execution and so that non-programmers also can set up a training i.e with excel file.