【问题标题】:Julia network expression FluxJulia 网络表达式 Flux
【发布时间】:2020-06-05 13:48:11
【问题描述】:

学习 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

【问题讨论】:

    标签: neural-network julia metaprogramming flux.jl


    【解决方案1】:

    evalFlux 无法区分的原语。你宁愿使用类似的东西

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

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

    但在元编程之前要三思。在诉诸eval 之前,请尝试编写一个宏来生成您的网络和损失函数。

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

    【讨论】:

    • 听起来很合理,但我在丢失 def "LoadError: UndefVarError: x not defined" 时遇到了下一个错误。顺便说一句,您对表达式与宏有什么顾虑?在基因编程的背景下,表达似乎是一种自然的方法。
    • 啊,是的,我太快了,现在我离开了我的电脑。您只需要使 net 成为一个带有 x 的表达式,而不是一个函数。明天我会更新答案。
    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多