你必须用Flux.jl编写一个自定义的训练循环来获得每个历元中的损失值吗



Flux.jl提供了一个有用的train!函数,当与@epoch宏配对时,该函数可以用作主训练循环。然而,与大多数自定义训练循环不同,在每个训练时期都没有关于模型准确性/损失的输出信息。train!函数确实提供了一个可选的回调,似乎可以用来显示训练的准确性,但我不确定该如何做到这一点。是否可以使用@epochtrain!获得这些值,或者我必须编写一个自定义的训练循环?

一种模式是可以将损失函数构造为do块。这个匿名函数成为train!的第一个参数。在返回损失之前,它可以包含您想要的任何打印或日志记录,然后用于计算梯度。

julia> m = Dense(ones(2,2));
julia> Flux.@epochs 3 Flux.train!(params(m), ([1,2], [3,4]), Descent(0.05)) do d
res = m(d)
@show res[1]  # intermediate value just printed
tot = sum(res)
@show tot  # final value is used for the gradient
end
[ Info: Epoch 1
res[1] = 3.0
tot = 6.0
res[1] = 6.3999999999999995
tot = 12.799999999999999
[ Info: Epoch 2
res[1] = 2.0999999999999996
tot = 4.199999999999999
res[1] = 4.499999999999999
tot = 8.999999999999998
[ Info: Epoch 3
res[1] = 1.2
tot = 2.4
res[1] = 2.599999999999999
tot = 5.199999999999998

有很多方法(不管好坏,Julia毕竟是TIMTOWTDI语言(。我想甚至还有几个包裹(我把这些建议留给更了解这些的人(但我要警告你不要害怕自定义循环

Flux中的自定义训练循环并不像听起来那么难,也不像听起来那么高级。它们既好又地道。

Julia循环很快。所以我们可以直接利用它们。。并通过编写普通代码将我们需要的内容插入到需要的地方。而不必使用复杂且不太清晰的回调等

你可以在这里找到他们的文档

最新更新