joblib.load __main__ AttributeError

joblib.load __main__ AttributeError,第1张

joblib.load __main__ AttributeError

您要获得的特定异常是指中的属性

__main__
,但这主要是红色鲱鱼。我很确定问题实际上与您转储实例的方式有关。

Pickle不会转储实际的代码类和函数,仅转储其名称。它包含每个模块定义所在的模块的名称,因此可以再次找到它们。如果转储正在作为脚本运行的模块中定义的类,则它将转储该名称

__main__
作为模块名称,因为这就是Python用作主模块的名称(如
if__name__ == "__main__"
样板代码所示)。

当您

model.py
以脚本形式运行并腌制其中定义的类的实例时,该类将另存为
__main__.NeuralNetwork
而不是
model.NeuralNetwork
。当您运行其他模块并尝试加载pickle文件时,Python会在
__main__
模块中查找该类,因为这是pickle数据告诉它查找的地方。这就是为什么您会收到有关的属性的异常的原因
__main__

为了解决这个问题,您可能想要更改转储数据的方式。除了

model.py
可能作为脚本运行之外,您可能还应该运行其他一些模块并让它执行
importmodel
,因此您可以使用其正常名称来获取该模块。(我想您可以
model.py
将自己导入到一个
if __name__ =="__main__"
块中,但这非常丑陋和尴尬)。您可能还需要避免在
model
导入时无条件重新创建和转储实例,因为这在加载pickle文件时需要发生(并且我认为pickle的全部目的是避免从头开始重新创建实例)。

因此,从的底部删除转储逻辑

model.py
,并添加一个新文件,如下所示:

# new script, dump_model.py, does the creation and dumping of the NeuralNetworkfrom sklearn.externals import joblibfrom model import NeuralNetworkif __name__ == "__main__":    model = NeuralNetwork(input_dim=12, units=64)    joblib.dump(model, 'demo_model.pkl')

当您转储

NeuralNetwork
使用此脚本的脚本时,它将正确地
model
将类定义为该模块,因此加载代码将能够导入该模块并正确地创建该类的实例。

您当前针对该问题的“修复”(

NeuralNetwork
__main__
加载对象时在模块中定义一个空类)可能是一个不好的解决方案。从加载pickle文件中获得的实例将是新类的实例,而不是原始类。它将加载旧实例的属性,但不会设置任何方法或其他类变量(这与您显示的类无关,但可能适用于任何类型的更复杂的对象)。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5648823.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存