Julia network expression Flux
学习 Julia 元编程以通过表达式自动构建 ANN。虽然一切都适用于推理,但后退阶段会引发错误:
LoadError: Can't differentiate foreigncall expression
下一个代码显示了问题出现的位置。虽然 eval(net(x)) 运行良好,但由于某种原因,它在梯度计算阶段引发了错误。
1 2 3 4 5 6 7 8 9 10 | # 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 |
的东西
1 2 | net = :($w2 * relu.($w1 * x .+ $b1) .+ $b2) @eval loss(x, y) = Flux.logitcrossentropy($net, y) |
这会构建
但在元编程之前要三思。在使用
当然,如果目标是将仅在运行时可用的表达式组合在一起,这将不起作用。遗传编程,在运行时创建大量随机表达式,听起来像是一个合理的例外。但即便如此,也可能有其他选择,例如使用您自己的受限表示(例如,您可以首先符号区分,然后"编译"为匿名函数)。