因此,我正在使用 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 个不同的名称,直到找到合适的名称!越来越烦人了
我究竟做错了什么?
预先感谢并注意安全!
宏BSON.@save并BSON.@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)