栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

joblib.load __main__ AttributeError

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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文件中获得的实例将是新类的实例,而不是原始类。它将加载旧实例的属性,但不会设置任何方法或其他类变量(这与您显示的类无关,但可能适用于任何类型的更复杂的对象)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/646624.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号