# How to get the gradient of NN wr to its input?

**URL:** <https://discourse.julialang.org/t/how-to-get-the-gradient-of-nn-wr-to-its-input/31034>\
**Category:** Machine Learning\
**Tags:** flux\
**Created:** [November 13, 2019, 9:44am UTC](https://discourse.julialang.org/t/how-to-get-the-gradient-of-nn-wr-to-its-input/31034 "2019-11-13T09:44:46Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![HenriDeh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrideh/32/8316_2.png) [@HenriDeh](https://discourse.julialang.org/u/HenriDeh)\
**Post date:** [November 13, 2019, 9:44am UTC](https://discourse.julialang.org/t/how-to-get-the-gradient-of-nn-wr-to-its-input/31034/1 "2019-11-13T09:44:46Z")

</div>

Why do I get this error with this MWE ?

```julia
nn= Dense(5,1)
static_input = [1,2,3,4]
variable_input = 5
opt = Nesterov()
ps = Flux.Params(variable_input)
g = Flux.gradient(ps) do
    sum(nn(vcat(static_input, variable_input)))
end

```

```julia
ERROR: MethodError: no method matching copy(::Nothing)
Closest candidates are:
  copy(::Expr) at expr.jl:36
  copy(::Core.CodeInfo) at expr.jl:64
  copy(::BitSet) at bitset.jl:46
  ...
Stacktrace:
 [1] extract_grad!(::Int64) at C:\Users\Henri\.julia\packages\Tracker\SAr25\src\back.jl:82
 [2] gradient_(::getfield(Main, Symbol("##40#41")), ::Tracker.Params) at C:\Users\Henri\.julia\packages\Tracker\SAr25\src\back.jl:102
 [3] #gradient#24(::Bool, ::Function, ::Function, ::Tracker.Params) at C:\Users\Henri\.julia\packages\Tracker\SAr25\src\back.jl:164
 [4] gradient(::Function, ::Tracker.Params) at C:\Users\Henri\.julia\packages\Tracker\SAr25\src\back.jl:164
 [5] top-level scope at none:0

```

---

<div class="post-metadata">

**Author:** ![findmyway](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/findmyway/32/4946_2.png) [@findmyway](https://discourse.julialang.org/u/findmyway)\
**Post date:** [November 15, 2019, 7:58am UTC](https://discourse.julialang.org/t/how-to-get-the-gradient-of-nn-wr-to-its-input/31034/2 "2019-11-15T07:58:15Z")

</div>

I’m a little confused about your MWE. Are you sure that `ps` is `variable_input` but not the params in `nn`? Then what do you want to update with this `g`?

---

<div class="post-metadata">

**Author:** ![HenriDeh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrideh/32/8316_2.png) [@HenriDeh](https://discourse.julialang.org/u/HenriDeh)\
**Post date:** [November 15, 2019, 8:07am UTC](https://discourse.julialang.org/t/how-to-get-the-gradient-of-nn-wr-to-its-input/31034/3 "2019-11-15T08:07:12Z")

</div>

I want to find the minimum of the curve it approximates using a simple gradient descent. It’s not to train the network. So yes. I could get that value using ReverseDiff.jl but I was hoping to use Flux to use the built-in optimizers.

---

<div class="post-metadata">

**Author:** ![jbrea](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jbrea/32/3879_2.png) [@jbrea](https://discourse.julialang.org/u/jbrea)\
**Post date:** [November 15, 2019, 8:36am UTC](https://discourse.julialang.org/t/how-to-get-the-gradient-of-nn-wr-to-its-input/31034/4 "2019-11-15T08:36:52Z")

</div>

Does this work as expected?

```julia
nn = Dense(5,1)
static_input = [1.,2,3,4]
variable_input = param([5])
ps = Flux.Params(variable_input)
g = Flux.gradient(ps) do
    sum(nn(vcat(static_input, variable_input)))
end

```

---

<div class="post-metadata">

**Author:** ![HenriDeh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrideh/32/8316_2.png) [@HenriDeh](https://discourse.julialang.org/u/HenriDeh)\
**Post date:** [November 15, 2019, 10:36am UTC](https://discourse.julialang.org/t/how-to-get-the-gradient-of-nn-wr-to-its-input/31034/5 "2019-11-15T10:36:52Z")

</div>

I think it does, g.grads is an IdDict of length 1 so It appears to have computed something like what I expect. But this is supposed to return the gradient I want isn’t it ?

```julia
>julia g[variable_input]
ERROR: KeyError: key Tracker.Tracked{Array{Float64,1}}(0x00000000, Tracker.Call{Nothing,Tuple{}}(nothing, ()), true, [0.8417484760284424]) not found
Stacktrace:
 [1] getindex at ./abstractdict.jl:599 [inlined]
 [2] getindex at /home/dehaybe/.julia/packages/Tracker/m6d46/src/params.jl:39 [inlined]
 [3] getindex(::Tracker.Grads, ::TrackedArray{…,Array{Float64,1}}) at /home/dehaybe/.julia/packages/Tracker/m6d46/src/params.jl:43
 [4] top-level scope at REPL[14]:1

```

---

<div class="post-metadata">

**Author:** ![findmyway](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/findmyway/32/4946_2.png) [@findmyway](https://discourse.julialang.org/u/findmyway)\
**Post date:** [November 15, 2019, 3:50pm UTC](https://discourse.julialang.org/t/how-to-get-the-gradient-of-nn-wr-to-its-input/31034/6 "2019-11-15T15:50:35Z")

</div>

> [@jbrea](#):
>
> ps = Flux.Params(variable\_input)

Replace it with `ps = Flux.Params([variable_input])` shoudl fix the error.

---

<div class="post-metadata">

**Author:** ![HenriDeh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrideh/32/8316_2.png) [@HenriDeh](https://discourse.julialang.org/u/HenriDeh)\
**Post date:** [November 15, 2019, 5:16pm UTC](https://discourse.julialang.org/t/how-to-get-the-gradient-of-nn-wr-to-its-input/31034/7 "2019-11-15T17:16:49Z")

</div>

Yes it does, thank you ! So to sum up, I had to use both `param` and `Params` and the inputs of Params should be arrays of tracked objects, not a tracked array.
