【问题标题】:Logging loss while training in Flux using callbacks使用回调在 Flux 中训练时记录损失
【发布时间】:2020-05-03 12:45:08
【问题描述】:

我正在尝试为 Flux 中的 train! 函数编写回调。 我的代码是:

cb_loss = x -> push!(x, loss(x_train, y_train))
loss_vector = Vector{Float32}()

Flux.train!(loss, ps, train_data, opt, cb=cb_loss(loss_vector))

它给了我这个错误:

MethodError: objects of type Float32 are not callable

Stacktrace:
 [1] call(::Float32) at C:\Users\arjur\.julia\packages\Flux\Fj3bt\src\optimise\train.jl:36
 [2] foreach at .\abstractarray.jl:1920 [inlined]
 [3] #10 at C:\Users\arjur\.julia\packages\Flux\Fj3bt\src\optimise\train.jl:38 [inlined]
 [4] macro expansion at C:\Users\arjur\.julia\packages\Flux\Fj3bt\src\optimise\train.jl:93 [inlined]
 [5] macro expansion at C:\Users\arjur\.julia\packages\Juno\oLB1d\src\progress.jl:134 [inlined]
 [6] #train!#12(::Array{Float32,1}, ::typeof(Flux.Optimise.train!), ::typeof(loss), ::Zygote.Params, ::DataLoader, ::Descent) at C:\Users\arjur\.julia\packages\Flux\Fj3bt\src\optimise\train.jl:81
 [7] (::Flux.Optimise.var"#kw##train!")(::NamedTuple{(:cb,),Tuple{Array{Float32,1}}}, ::typeof(Flux.Optimise.train!), ::Function, ::Zygote.Params, ::DataLoader, ::Descent) at .\none:0
 [8] top-level scope at In[108]:1

有趣的是,它正确地将第一个值添加到向量中,然后崩溃,所以我猜错误消息与此有关。

我检查了train! 函数之外的函数,它可以工作,那么我应该如何重写这个函数以将损失记录在向量中?

【问题讨论】:

    标签: machine-learning deep-learning julia


    【解决方案1】:

    看来你需要像这样传递它:cb=callback。因此,可以使用全局变量或像这样定义回调来完成:

    loss_vector = Vector{Float32}()
    callback() = push!(loss_vector, loss(x_train, y_train))
    
    Flux.train!(loss, ps, train_data, opt, cb=callback)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-01
      • 2018-03-30
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      相关资源
      最近更新 更多