繁体   English   中英

Julia 网络表达式 Flux

[英]Julia network expression Flux

学习 Julia 元编程通过表达式自动构建 ANN。 虽然一切都适用于推理,但后退阶段会引发错误:

LoadError:无法区分foreigncall表达式

下一个代码显示了问题出现的位置。 虽然 eval(net(x)) 运行良好,但由于某种原因,它在梯度计算阶段引发了错误。

# define ANN by expression
net(x) = :($w2 * relu.($w1 * $x .+ $b1) .+ $b2)

# define loss and network evaluation
loss(x, y) = Flux.logitcrossentropy(eval(net(x)), y)

θ = Flux.Params([w1, b1, w2, b2])

# eval network and calculate gradients
gs = gradient(() -> loss(features, labels), θ)  # where the problem appears

eval是 Fl Flux无法区分的原语。 你宁愿使用类似的东西

net = :($w2 * relu.($w1 * x .+ $b1) .+ $b2)
@eval loss(x, y) = Flux.logitcrossentropy($net, y)

这会构建loss表达式并对其进行一次评估,而不是每次调用损失 function 时评估(并因此编译)同一段代码。

但在元编程之前要三思。 在使用eval之前,尝试编写一个宏来生成您的网络和损失 function。

当然,如果目标是将仅在运行时可用的表达式组合在一起,这将不起作用。 遗传编程,在运行时创建大量随机表达式,听起来像是一个合理的例外。 但即便如此,也可能有其他选择,例如使用您自己的受限表示(例如,您可以首先符号区分,然后“编译”为匿名函数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM