Let’s say I have something along the lines of
using Symbolics, Flux
@variables x,y
function f()
[x^2y^3 ; x+y^2]
end
grad_f(x,y) = Flux.gradient(transpose(f())*f(), x,y)
display(grad_f(x,y))
The following error comes:
ERROR: Sym x^(4(y^3)) + (x + y^2)^2 is not callable. Use @syms x^(4(y^3)) + (x + y^2)^2(var1, var2,…) to create it as a callable.
However it isn’t clear how I use “Use @syms x^(4(y^3)) + (x + y^2)^2(var1, var2,…)”. That is I am not sure where I include this or the syntactical formatting necessary.
https://docs.juliahub.com/Symbolics/eABRO/3.4.0/tutorials/symbolic_functions/#Syms-and-callable-Syms-1
Additionally if I use
grad_f(x,y) = Symbolics.gradient(transpose(f())*f(), [x,y])
method I always get a zero vector returned. Namely, it returns
2-element Vector{Num}:
0
0
I am afraid Symbolics and Flux are not compatible.
This is false given I just managed to get the following to work:
using Symbolics, Flux
@variables x,y,z
function ff(x,y,z)
x^2+y^2*z
end
grad_ff(x,y,z) = Flux.gradient(ff, x,y,z)
the output is:
(2x, 2y*z, y^2)
I found a fix, consider the following MWE
using Symbolics, Flux
@variables x, y
function f(x,y)
A = transpose([x;y])*[x;y]
return A[1]
end
display(f(x,y))
This returns
x^2 + y^2
Then if I add
Flux.gradient(f,x,y)
it returns
(2x, 2y)
Which is correct. Seems I was using incorrect syntax for what I wanted.
Note that Flux reexports gradient
from Zygote.jl, so unless you need the NN functionality I’d recommend using that instead.
1 Like