python - 如何在类中使用私有(private)方法反序列化 PyTorch 保存的模型?

标签 python serialization deployment pytorch pickle

我使用 PyTorch 保存方法序列化了一堆必需的对象。其中,有一个类在同一个类的 __init__ 中引用了一个私有(private)方法。现在,在序列化之后,我无法反序列化(unpickle)文件,因为私有(private)方法在类之外是不可访问的。知道如何解决或绕过它吗?我需要恢复保存到该类的属性中的数据。

  File ".conda/envs/py37/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3331, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-1-a5666d77c70f>", line 1, in <module>
    torch.load("snapshots/model.pth", map_location='cpu')
  File ".conda/envs/py37/lib/python3.7/site-packages/torch/serialization.py", line 529, in load
    return _legacy_load(opened_file, map_location, pickle_module, **pickle_load_args)
  File ".conda/envs/py37/lib/python3.7/site-packages/torch/serialization.py", line 702, in _legacy_load
    result = unpickler.load()
AttributeError: 'Trainer' object has no attribute '__iterator'
  • 编辑-1:

这里有一段代码会产生我现在面临的问题。

import torch

class Test:
    def __init__(self):
        self.a = min
        self.b = max
        self.c = self.__private  # buggy

    def __private(self):
        return None

test = Test()

torch.save({"test": test}, "file.pkl")
torch.load("file.pkl")

但是,如果您从方法中删除私有(private)属性,则不会出现任何错误。

import torch

class Test:
    def __init__(self):
        self.a = min
        self.b = max
        self.c = self.private  # not buggy

    def private(self):
        return None

test = Test()

torch.save({"test": test}, "file.pkl")
torch.load("file.pkl")

最佳答案

这个问题类似于 Python multiprocessing - mapping private method , 但由于开放赏金不能被标记为重复。

此问题源于 Python 错误跟踪器上的这个未解决问题:Objects referencing private-mangled names do not roundtrip properly under pickling ,并且与 pickle 处理名称修改的方式有关。有关此答案的更多详细信息:https://stackoverflow.com/a/57497698/6352677 .

此时,唯一的解决方法是不在 __init__ 中使用私有(private)方法。

关于python - 如何在类中使用私有(private)方法反序列化 PyTorch 保存的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61128428/

相关文章:

c++ - Lib 和 DLL 链接到 exe 错误 "cannot read at 0x300"

node.js - 如何使用 NPM 打包部署?

python - 将pyspark数据帧转换为python字典列表

Python日志没有输出任何东西

c++ - 序列化具有不同成员的继承类 MFC c++

c++ - C++ 中的 Python struct.pack/unpack 等价物

c# - 如何序列化一切

java - 其他平台的可执行文件,如 Launch4j

python - 递归解析而不是使用 pop

python - TextBlob NaiveBayesAnalyzer 极慢(与 Pattern 相比)