使用 BSON 的意外行为:Julia 中的 @load

ger*_*ini 5 julia

因此,我正在使用 Julia 中的包训练神经网络模型Flux。在训练过程中,每次迭代获得模型的改进,后者都会保存在我的计算机中。为此,我使用以下行:

if acc_te[epoch_i] >= best_acc
     @info(" -> New best accuracy! Saving model out to mymodel.bson")
     @save "mymodel.bson" m
     best_acc = acc_te[epoch_i];
     last_improvement = epoch_i;
end
Run Code Online (Sandbox Code Playgroud)

我认为这是相当标准的(我从 model-Zoo 中提取它)。

训练结束时,可以公平地假设保存的模型“mymodel.bson”是我得到的最好的模型。到目前为止,一切都很好!。现在,问题是:

第二天早上,我打开一个终端,发生的事情是这样的(每次都是一样的):

julia>using Flux;
julia>using BSON: @save
julia>using BSON: @load
julia> @load "mymodel.bson" model
ERROR: KeyError: key :model not found
Stacktrace:
 [1] getindex(::Dict{Symbol,Any}, ::Symbol) at ./dict.jl:477
 [2] top-level scope at /home/gbrunini/.julia/packages/BSON/XAts7/src/BSON.jl:53
julia>
julia> #maybe try another name
julia> @load "mymodel.bson" someothername
ERROR: KeyError: key :someothername not found
Stacktrace:
 [1] getindex(::Dict{Symbol,Any}, ::Symbol) at ./dict.jl:477
 [2] top-level scope at /home/gbrunini/.julia/packages/BSON/XAts7/src/BSON.jl:53
julia> #maybe try another name
.....same error...
julia> #maybe try another name
.... same error....
julia> #maybe try another name
.... same error....
julia> #maybe try another name
julia>@load "mymodel.bson" m     # eureca! this name works!
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?有没有一些禁忌的名字?有时它可以与其他名称配合使用,但我总是必须尝试至少 5-6 个不同的名称,直到找到合适的名称!越来越烦人了

我究竟做错了什么?

预先感谢并注意安全!

Prz*_*fel 3

BSON.@saveBSON.@load存储具有确切给定名称的变量。您无法使用不同的名称恢复它。

using BSON
x=5
BSON.@save "mydoc.bson" x
Run Code Online (Sandbox Code Playgroud)

这已将值5与名称一起存储x

如果您尝试使用错误的名称恢复它,它将不会被发现:

julia> BSON.@load "mydoc.bson" y
ERROR: KeyError: key :y not found
Run Code Online (Sandbox Code Playgroud)

而不是那样 - 您需要使用原始名称进行恢复 - 看看值如何被覆盖:

julia> x=999
999

julia> BSON.@load "mydoc.bson" x

julia> x
5
Run Code Online (Sandbox Code Playgroud)

那么,当您需要更大的灵活性时该怎么办呢?使用BSON.parse返回 a 的函数Dict,您可以用它做任何您需要的事情:

julia> BSON.parse("mydoc.bson")
Dict{Symbol,Any} with 1 entry:
  :x => 5
Run Code Online (Sandbox Code Playgroud)