python - Python莳萝:KeyError:'ClassType'
问题描述
我正在尝试腌制课程。Pickle 因属性错误而失败,因为加载时类构造函数不存在。我收集到该dill
模块是模块的扩展pickle
。但是,我仍然遇到错误。即:
Traceback (most recent call last):
File "C:\Users\s4551072\.conda\envs\gpuenv\lib\site-packages\IPython\core\interactiveshell.py", line 3331, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-4-447b415d0f92>", line 1, in <module>
dill.load(open('hp', 'rb'))
File "C:\Users\s4551072\.conda\envs\gpuenv\lib\site-packages\dill\_dill.py", line 270, in load
return Unpickler(file, ignore=ignore, **kwds).load()
File "C:\Users\s4551072\.conda\envs\gpuenv\lib\site-packages\dill\_dill.py", line 472, in load
obj = StockUnpickler.load(self)
File "C:\Users\s4551072\.conda\envs\gpuenv\lib\site-packages\dill\_dill.py", line 577, in _load_type
return _reverse_typemap[name]
KeyError: 'ClassType'
我在加载时得到的。
保存时:
dill.dump(hp, open('hp', 'wb'))
加载时(在完全不同的文件中):
dill.load(open('hp', 'rb'))
hp
以下类的实例在哪里
import tensorflow as tf
import resources.toolbox as tb
class HParams(tb.HyperParam):
def __init__(self):
# =================== Enviroment ========================
super().__init__()
self.exp_name = 'trial' # 'gru_vs_rnn_vs_lstm'
self.save_path = './tmp/lstm/' + self.exp_name
self.save_path = os.path.abspath(self.save_path)
os.makedirs(self.save_path, exist_ok=True)
self.pkg = tf.__name__
self.s = tb.get_diag(16, 44)
我尝试了各种技巧都无济于事。
ُEDIT1:
这是主文件:
import lib
import dill
class HP(lib.HyperParam):
def __init__(self):
super().__init__()
if __name__ == '__main__':
hp = HP()
dill.dump(hp, open('myfile', 'wb'))
这是lib
模块
import os
import inspect
class HyperParam:
def __init__(self):
"""
It is preferable to pass the packages used, so that later this class can be saved and loaded.
"""
# =================== Enviroment ========================
self.exp_name = 'default'
self.root = 'tmp'
self.pkg = None
# self.device = config_device(HyperParam, Device.gpu0)
# ===================== DATA ============================
self.cal = [False, True][0]
self.freq_select = None
self.norm_factor = None
self.sort_freq = None
self.dmd = False
self.seed = 234
# =================== Model =============================
self.l1 = 0.0005
# ===================== Training ========================
self.split = 0.2
self.lr = 0.0005
self.batch_size = 32
self.epochs = 30
self.milk = [None]
self.nsl = [False, True][0]
self.adv_multiplier = 0.2
self.adv_step_size = 0.01
self.adv_grad_norm = 'infinity'
@staticmethod
def from_saved(path):
path = os.path.join(path, f'metadata/HyperParam')
import pickle
return pickle.load(open(path, "rb"))()
def __repr__(self):
return ''.join(inspect.getsourcelines(self.__class__)[0])
运行主文件,它将保存和对象。现在,在一个新文件中,尝试加载:
import dill
a = dill.load(open('myfile', 'rb'))
Traceback (most recent call last):
File "C:\Users\s4551072\.conda\envs\gpuenv\lib\site-packages\IPython\core\interactiveshell.py", line 3331, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-3-390afbf8b35b>", line 1, in <module>
a = dill.load(open('./training/myfile', 'rb'))
File "C:\Users\s4551072\.conda\envs\gpuenv\lib\site-packages\dill\_dill.py", line 270, in load
return Unpickler(file, ignore=ignore, **kwds).load()
File "C:\Users\s4551072\.conda\envs\gpuenv\lib\site-packages\dill\_dill.py", line 472, in load
obj = StockUnpickler.load(self)
File "C:\Users\s4551072\.conda\envs\gpuenv\lib\site-packages\dill\_dill.py", line 462, in find_class
return StockUnpickler.find_class(self, module, name)
AttributeError: Can't get attribute 'HP' on <module '__main__'>
解决方案
推荐阅读
- webpack - 在 Electron App 中启动 DevTools 后 HMR 中断
- c++ - C++二维数组的访问效率
- reactjs - 停止从 RTKQ 接收流式更新的正确方法是什么?
- reactjs - useQuery 和 useState
- elm - 通过在 elm 中将它们作为函数的参数输入来访问列表的列
- android - 从视图中的 url 加载图像
- typo3 - 如何将 TYPO3 的默认 RTE CK Editor 预设与 RTE CK 编辑器的完整预设交换?
- node.js - 未找到模块:导入 Clarifai API 后无法解析“http2”
- react-native - Stanza Jingle 无法在 React Native 中使用 XMPP 服务器进行 webRTC 信令
- c# - 使用 MVVM 将新项目添加到 TabControl 的 ItemSource 时选择最后一个 TabItem