gpt4 book ai didi

python - 当使用Python类作为程序配置结构(包括继承的类属性)时,保存/恢复的好方法是什么?

转载 作者:行者123 更新时间:2023-11-30 22:14:05 24 4
gpt4 key购买 nike

假设我有一个(简化的)类(class),如下所示。我将它用于程序配置(超参数)。

# config.py
class Config(object): # default configuration
GPU_COUNT = 1
IMAGES_PER_GPU = 2
MAP = {1:2, 2:3}

def display(self):
pass

# experiment1.py
from config import Config as Default
class Config(Default): # some over-written configuration
GPU_COUNT = 2
NAME='2'

# run.py
from experiment1 import Config
cfg = Config()
...
cfg.NAME = 'ABC' # possible runtime over-writing

# Now I would like to save `cfg` at this moment

我想保存此配置并稍后恢复。恢复时必须不关心成员函数。

<强>1。当我尝试 pickle 时:

import pickle
with open('cfg.pk', 'rb') as f: cfg = pickle.load(f)

##--> AttributeError: Can't get attribute 'Config' on <module '__main__'>

我看到了使用 Configclass_def 的解决方案,但我希望我可以在不知道类定义的情况下恢复配置(例如,导出到 dict 并另存为 JSON)

<强>2。我尝试将类转换为 dict (以便我可以导出为 JSON)

cfg.__dict__     # {'NAME': 'ABC'}
vars(cfg) # {'NAME': 'ABC'}

在这两种情况下,访问属性都很困难。可能吗?

最佳答案

问题的标题是“如何将 python 类转换为 dict”,但我怀疑您实际上只是在寻找一种简单的方法来表示(超)参数。

到目前为止,最简单的解决方案是不使用类。我在一些机器学习教程中看到过这种情况,但我认为这是一个非常丑陋的黑客行为。它打破了有关类与对象的一些语义,并且 pickle 的困难就是由此产生的。您使用像这样的简单类怎么样:

class Params(dict):
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__

def __getstate__(self):
return self

def __setstate__(self, state):
self.update(state)

def copy(self, **extra_params):
return Params(**self, **extra_params)

它可以完成类方法可以做的所有事情。预定义的配置只是您在编辑之前应该复制的对象,如下所示:

config = Params(
GPU_COUNT = 2,
NAME='2',
)
other_config = config.copy()
other_config.GPU_COUNT = 4

或者一步一步:

other_config = config.copy(
GPU_COUNT = 4
)

与pickle配合良好(尽管您需要在源代码中的某个位置拥有Params类),并且您也可以轻松编写loadParams 类的 save 方法(如果您想使用 JSON)。

简而言之,不要将类用于实际上只是对象的东西。

关于python - 当使用Python类作为程序配置结构(包括继承的类属性)时,保存/恢复的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50613665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com