使用BSON时出现意外行为:@load in Julia

使用BSON时出现意外行为:@load in Julia,julia,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 = a

因此,我正在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
我认为这是相当标准的(我从ModelZoo中提取的)

在培训结束时,可以公平地假设保存的模型“mymodel.bson”是我得到的最好的。到现在为止,一直都还不错!。 现在,问题是:

第二天早上,我打开一个航站楼,事情就是这样(每次都一样):

为什么会这样?有一些被禁止的名字吗? 有时它与其他名字一起使用,但我总是要尝试至少5-6个不同的名字,直到我找到一个合适的名字!越来越烦人了

我做错了什么


提前感谢并保持安全

BSON.@save
BSON.@load
使用确切的给定名称存储变量。无法使用其他名称还原它

using BSON
x=5
BSON.@save "mydoc.bson" x
这将值
5
与名称
x
一起存储

如果您尝试使用错误的名称恢复,将找不到:

julia> BSON.@load "mydoc.bson" y
ERROR: KeyError: key :y not found
相反,您需要使用原始名称进行恢复,以查看值是如何被覆盖的:

julia> x=999
999

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

julia> x
5
那么,当你需要更多的灵活性时该怎么办呢?使用返回Dict的
BSON.parse
函数,您可以根据需要使用它:

julia> BSON.parse("mydoc.bson")
Dict{Symbol,Any} with 1 entry:
  :x => 5
BSON使用DICT保存和加载数据
BSON
基于顶级的
Dict
进行保存和加载,该Dict通常将变量的名称存储为其键(
m

如果加载
.bson
则检索该字典,并再次实例化相应的变量,将其dict键作为名称,dict值作为值

看看已经存在的展示案例的
README.md

因此,如果您想要更大的灵活性,您可以通过BSON直接保存一个
Dict
(查看前面提到的
README.md
)并执行以下操作:

if acc_te[epoch_i] >= best_acc
     @info(" -> New best accuracy! Saving model out to mymodel.bson")
     bson("mymodel.bson", Dict(:model => m, <...other key-value stuff you want to save...>)
     best_acc = acc_te[epoch_i];
     last_improvement = epoch_i;
end
if acc_te[epoch_i]>=最佳acc
@信息(“->新的最佳精度!将模型保存到mymodel.bson”)
bson(“mymodel.bson”,Dict(:model=>m,)
最佳会计科目=会计科目[会计科目];
最后的改进=新纪元;
结束
奖金/意见 BSON提供了两种语言之间更好的互操作性,但在保存/加载性能和文件大小方面,我发现这项工作做得更好。因此,以防您想根据您的使用情况检查替代方案


[edit:fixed typo]

谢谢,@Przemyslaw我不知道我必须使用相同的键名再次加载。很有趣。我希望更像是一个
writedlm(“savingname”,a)
B=readdlm(“savingname”)
behavior。所以,现在我知道了正确加载模型的名称!再次感谢!很好,谢谢@Daniel我将利用您的建议使程序更加灵活!
if acc_te[epoch_i] >= best_acc
     @info(" -> New best accuracy! Saving model out to mymodel.bson")
     bson("mymodel.bson", Dict(:model => m, <...other key-value stuff you want to save...>)
     best_acc = acc_te[epoch_i];
     last_improvement = epoch_i;
end