# How to initialize a subset of params of a NN

Suppose I have a trained neural net
`nn1 = Flux.Chain(Dense(90, 60, relu), Dense(60, 30, relu), Dense(30,1)).`

I am aware that I can access the weights corresponding to the first 2 layers by params(nn1), params(nn1).

However, I then set up
`nn2 = Flux.Chain(Dense(90, 60, relu), Dense(60, 30, relu), Dense(30,2))`.

Note that nn1 and nn2 have the same structure in first 2 layers.

Can I initialize the weights of the first two layers with

``````params(nn2) = params(nn1)
params(nn2) = params(nn1)
``````

I wonder what is the most idiomatic answer to this question, but you may go to low level.

Since `Dense` is just an ordinary immutable structure which contains data, you can change it’s weights directly.

``````nn2.W .= nn1.W
nn2.b .= nn1.b
``````

or you can wrap it (unsafe) function

``````function Base.:setindex!(c::Chain, d::Dense, i)
c.layers[i].W .= d.W
c.layers[i].b .= d.b
end

nn2 = nn1
nn2 = nn1
``````

But I think it’s better to construct `nn2` from `nn1` directly

``````nn2 = Flux.Chain(deepcopy(nn1[1:2])..., Dense(30, 2))
``````

Also you may use `loadparams!` function.

``````Flux.loadparams!(nn2[1:2], params(nn1[1:2]))
``````

It is more generic approach, since it doesn’t rely on internal structure of `Dense`. If you want, you may add some sugar

``````Base.:setindex!(c::Chain, x, i) = Flux.loadparams!(c[i], params(x))
nn2[1:2] = nn1[1:2]
``````