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



