使用BSON时出现意外行为:@load in Julia
因此,我正在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
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