【问题标题】:How to save my class to load in another environment如何保存我的课程以在另一个环境中加载
【发布时间】:2021-12-17 11:51:34
【问题描述】:

从概念上讲,我想做一些简单的事情:保存一个我以后可以从另一个(不同的)程序访问的 python 对象。

但问题是它周围有一个包装器(下面的 f(x)),在新环境中没有被引用。

花了整整 12 个小时后,我感到比开始时更加困惑。我认为“泡菜”或“莳萝”等……是我应该做的。但我遇到了酸洗问题。但是在线阅读让我无处可去。 (顺便说一句,我尝试了 shap.save,但它遇到了同样的问题,并且无论如何都使用 pickle)。

import shap, pickle

model = ... (some tensorflow function)

def f(X):
    ...
    return model.predict(...).flatten()
explainer = shap.KernelExplainer(f, X.iloc[:50, :])

with open(f"/tmp/{file}.pkl", 'wb') as fil:
    # explainer.save(fil)
    pickle.dump(explainer, fil)

这不起作用,因为它“找不到 属性 'f'"。这些看起来是我能找到的最有前途的文章,但我无法为我的场景实现。

http://gael-varoquaux.info/programming/decoration-in-python-done-right-decorating-and-pickling.html

Unable to load files using pickle and multiple modules

https://github.com/slundberg/shap/issues/295

Python: Can't pickle type X, attribute lookup failed

*** 请为我提供有关 cmets 术语的建议,以改进我的提问方式,因为我不知道如何表达我的提示。

【问题讨论】:

    标签: python save pickle shap


    【解决方案1】:

    通常,在任何编程语言中,您都不会保存对象,而是将对象的属性保存到文件中。然后你应该创建一个函数来读取文件并将值填充到你的对象中。 您可以将您的对象制作成一个可安装的包,然后将该包作为一个对象导入您的程序中。

    import pickle
    
    class A(Object):
         def __init__(self, var1, var2):
             self.var1 = var1
             sefl.var2 = var2
         def dump_obj(self, fn):
             
             pickle.dump(self, fn, pickle.HIGHEST_PROTOCOL)
    
    

    在您要加载对象并将数据输入对象的文件中

    import pickle
    import file_with_object_A
    
    def load_A(fn):
        with open(fn, 'rb') as file:
            new_a = pickle.load(fn)
            # or alternatively, you can load each attribute into a variable and feed it to your object
            var1, var2 = file.readline(fn)
            my_new_A = A(var1, var2)
    

    记得将您详细说明函数f(X) 的文件导入到您的新代码文件中,或者以 的方式或保留此文件包含f(X) 与当前工作文件在同一目录中。

    你可以看看这个答案Saving an Object (Data persistence)

    【讨论】:

    • 谢谢,这很有帮助。有什么建议可以更好地表达我的问题吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多