【发布时间】:2021-07-04 19:28:19
【问题描述】:
我经常遇到的一个常见问题是我的模型将包含具有 NaN 值的矩阵。有没有一种通用的 Flux 方法可以将我的矩阵传入并检测这些 NaN?我知道 Julia 有一个内置的 isnan() 函数,可以在某些情况下使用,但我不确定是否有特定于 Flux 的版本?
【问题讨论】:
我经常遇到的一个常见问题是我的模型将包含具有 NaN 值的矩阵。有没有一种通用的 Flux 方法可以将我的矩阵传入并检测这些 NaN?我知道 Julia 有一个内置的 isnan() 函数,可以在某些情况下使用,但我不确定是否有特定于 Flux 的版本?
【问题讨论】:
不,没有 Flux 特定的功能。在大多数情况下,使用any(isnan, A) 可能是您想要做的。一种与 Flux 相关的“增强”是在检测到 NaN 时使用训练循环回调来停止训练。
# assumes (x, y) is your training data
# and loss(x, y, mode) will compute the loss of model on (x, y)
cb = () -> isnan(loss(x, y, model)) && Flux.stop()
# basic train loop
# assuming opt is your optimizer
Flux.train!((x, y) -> loss(x, y, model), params(model), [(x, y)], opt; cb = cb)
上面的例子是基本思想,你可以扩展到检查不同的数组是否有 NaN。例如,你可以这样做
cb = () -> any(params(m)) do p
any(isnan, p)
end && Flux.stop()
检查任何参数是否为NaN。
【讨论】: