首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用DiffEqFlux预测ODE参数

用DiffEqFlux预测ODE参数
EN

Stack Overflow用户
提问于 2019-10-16 20:02:06
回答 1查看 648关注 0票数 2

我试图建立一个神经网络,它将接受ODE系统的解,并预测系统的参数。我使用的是朱莉娅,特别是DiffEqFlux包。网络的结构是几个简单的Dense层,它们可以预测一些中间参数(在这种情况下,是一些化学反应自由能),然后输入一些确定性的(未经训练的)层,将这些参数转换成进入方程组的参数(在这种情况下,是反应速率常数)。我在这里尝试过两种不同的方法:

  1. 将ODE作为网络的最后一层直接解决。在这种情况下,损失函数只是比较输入和输出。
  2. 在损耗函数中有ODE解,所以网络输出只是参数。

但是,在这两种情况下,我都不能让Flux.train!实际运行。

下面是第一个选项的一个愚蠢的小例子,它提供了与我所得到的错误相同的错误(我已经尝试让尽可能多的事情与我的实际情况并行,即求解器等等,尽管我确实省略了中间的确定性层,因为它们似乎并没有起到作用)如下。

代码语言:javascript
运行
复制
using Flux, DiffEqFlux, DifferentialEquations

# let's use Chris' favorite example, Lotka-Volterra
function lotka_volterra(du,u,p,t)
  x, y = u
  α, β, δ, γ = p
  du[1] = dx = α*x - β*x*y
  du[2] = dy = -δ*y + γ*x*y
end
u0 = [1.0,1.0]
tspan = (0.0,10.0)

# generate a couple sets of solutions to train on
training_params = [[1.5,1.0,3.0,1.0], [1.4,1.1,3.1,0.9]]
training_sols = [solve(ODEProblem(lotka_volterra, u0, tspan, tp)).u[end] for tp in training_params]

model = Chain(Dense(2,3), Dense(3,4), p -> diffeq_adjoint(p, ODEProblem(lotka_volterra, u0, tspan, p), Rodas4())[:,end])

# in this case we just want outputs to match inputs
# (actual parameters we're after are outputs of next-to-last layer)
training_data = zip(training_sols, training_sols)

# mean squared error loss
loss(x,y) = Flux.mse(model(x), y)

p = Flux.params(model[1:2])

Flux.train!(loss, p, training_data, ADAM(0.001))
# gives TypeError: in typeassert, expected Float64, got ForwardDiff.Dual{Nothing, Float64, 8}

我已经尝试了所有三个解决程序层,diffeq_adjointdiffeq_rddiffeq_fd,它们都不起作用,但都会产生不同的错误,我在解析过程中遇到了困难。

对于另一个选项(实际上我更喜欢这一选项,但这两种方法都可以工作),只需将模型和损失函数定义替换为:

代码语言:javascript
运行
复制
model = Chain(Dense(2,3), Dense(3,4))

function loss(x,y)
   p = model(x)
   sol = diffeq_adjoint(p, ODEProblem(lotka_volterra, u0, tspan, p), Rodas4())[:,end]
   Flux.mse(sol, y)
end

引发的错误与上述相同。

我已经黑了一个多星期了,完全不知所措,有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-10-16 23:56:35

您正在遇到https://github.com/JuliaDiffEq/DiffEqFlux.jl/issues/31,即Jacobian的前向模式AD现在对Flux.jl不太好。要解决这个问题,请使用Rodas4(autodiff=false)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58420907

复制
相关文章

相似问题

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