首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何求取Julia中神经网络的导数

如何求取Julia中神经网络的导数
EN

Stack Overflow用户
提问于 2021-12-13 02:05:21
回答 1查看 172关注 0票数 2

我用神经网络求解了一个微分方程。我在下面留下了一个例子。我想要计算这个神经网络的一阶导数,关于它的输入"x“,并对任何"x”求出这个导数。

1-注意到我计算der = discretize.derivative。这是神经网络对"x“的导数吗?使用这个表达式,如果我输入[first(der(phi, u, [x], 0.00001, 1, res.minimizer)) for x in xs],我会得到一些不知道它是否是导数的东西,但是我无法在数组中找到一种提取它的方法,更不用说绘制它了。我如何评估这个导数在任何一点,让我们说,在数组中的所有点定义为"xs"?在下面的更新中,我给出了一种更简单的方法来尝试计算导数(但仍然没有成功)。

2-还有其他的方法可以得到关于神经网络x的导数吗?

我是朱莉娅的新手,所以我有点纠结于如何操作数据类型。谢谢你的建议!

更新:我找到了一种方法来查看神经网络的符号表达式,执行以下操作:

代码语言:javascript
复制
predict(x) = first(phi(x,res.minimizer))
df(x)      = gradient(predict, x)[1]

在REPL中运行代码类型为predict(x)df(x)的两行代码之后,它将根据求解的权重和偏差,将完整的神经网络吐出。但是,我不能计算梯度,它会产生一个错误。如何求函数predict(x)的x的梯度??

生成神经网络并求解方程的原代码

代码语言:javascript
复制
using NeuralPDE, Flux, ModelingToolkit, GalacticOptim, Optim, DiffEqFlux
import ModelingToolkit: Interval, infimum, supremum

@parameters x
@variables u(..)

Dx   = Differential(x)
a    = 0.5
eq   = Dx(u(x)) ~ -log(x*a)

# Initial and boundary conditions
bcs  = [u(0.) ~ 0.01]
# Space and time domains
domains           = [x ∈ Interval(0.01,1.0)]
# Neural network
n                 = 15
chain             = FastChain(FastDense(1,n,tanh),FastDense(n,1))
discretization    = PhysicsInformedNN(chain, QuasiRandomTraining(100))
@named pde_system = PDESystem(eq,bcs,domains,[x],[u(x)])
prob              = discretize(pde_system,discretization)

const losses = []
cb = function (p,l)
    push!(losses, l)
    if length(losses)%100==0
        println("Current loss after $(length(losses)) iterations: $(losses[end])")
    end
    return false
end

res  = GalacticOptim.solve(prob, ADAM(0.01); cb = cb, maxiters=300)
prob = remake(prob,u0=res.minimizer)
res  = GalacticOptim.solve(prob,BFGS(); cb = cb, maxiters=1000)
phi  = discretization.phi
der  = discretization.derivative

using Plots

analytic_sol_func(x) = (1.0+log(1/a))*x-x*log(x)
dx                   = 0.05
xs                   = LinRange(0.01,1.0,50)
u_real               = [analytic_sol_func(x) for x in xs]
u_predict            = [first(phi(x,res.minimizer)) for x in xs]
x_plot               = collect(xs)
xconst               = analytic_sol_func(1)*ones(size(xs))
plot(x_plot ,u_real,title = "Solution",linewidth=3)
plot!(x_plot ,u_predict,line =:dashdot,linewidth=2)
EN

回答 1

Stack Overflow用户

发布于 2021-12-15 22:25:19

我找到的解决办法是用ForwardDiff来区分近似。

因此,如果神经网络对未知函数的逼近被称为"funcres“,那么我们取其对x的导数,如下所示。

代码语言:javascript
复制
using ForwardDiff
funcres(x) = first(phi(x,res.minimizer))
dxu        = ForwardDiff.derivative.(funcres, Array(x_plot))
display(plot(x_plot,dxu,title = "Derivative",linewidth=3))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70329234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档