使用pickle保存hyperopt Trials字典时仅trial_0留存,trial_1丢失如何解决?
问题描述
我在使用pickle保存hyperopt的Trials对象字典时遇到问题:
我的trials字典包含两个Trials对象:
trials = { 'trial_0': <hyperopt.base.Trials object at 0x0000020B6F875E50>, 'trial_1': <hyperopt.base.Trials object at 0x0000020C32DA9490> }
执行以下代码进行保存:
fname = r'C:\Users\test09.pkl' with open(fname, 'wb+') as fpkl: pass for trial_label, trial in trials.items(): print(f"\nData for {trial_label}:") with open(fname, "ab") as file: pickle.dump(trials[trial_label], file)
通过print可确认两个Trials对象都有完整数据,但读取pkl文件时(代码如下)仅能获取trial_0的内容,trial_1的信息丢失:
with open(r'C:\Users\test09.pkl','rb') as file: data = pickle.load(file) for trial in data.trials: print(trial) with open(r'C:\Users\output_test10.txt', 'w') as file: for alle in data.trials: file.write(str(alle)+'\n')
请问为何trial_1的信息未被写入pkl文件?该如何解决此问题?
问题原因
不是trial_1没写入文件,而是读取方式有误。你分两次调用pickle.dump(),会把两个Trials对象依次序列化到同一个pkl文件中,但读取时只调用了一次pickle.load(),该方法仅会读取文件里的第一个序列化对象(即trial_0),第二个对象仍留在文件中未被读取,所以你看不到trial_1的内容。
解决方法
方法一:直接保存整个字典(推荐)
没必要分开保存每个Trials对象,直接把整个trials字典一次性dump到文件,读取时直接加载整个字典即可获取两个对象:
# 保存 fname = r'C:\Users\test09.pkl' with open(fname, 'wb') as file: pickle.dump(trials, file) # 读取 with open(fname, 'rb') as file: loaded_trials = pickle.load(file) # 访问两个对象 print(loaded_trials['trial_0'].trials) print(loaded_trials['trial_1'].trials)
方法二:读取所有序列化对象
如果必须分开dump,读取时需要循环调用pickle.load()直到文件指针到达末尾:
# 读取 loaded_trials = [] with open(r'C:\Users\test09.pkl','rb') as file: while True: try: trial = pickle.load(file) loaded_trials.append(trial) except EOFError: break # 读到文件末尾,停止循环 # loaded_trials[0]是trial_0,loaded_trials[1]是trial_1 print(loaded_trials[0].trials) print(loaded_trials[1].trials)
内容的提问来源于stack exchange,提问作者Lance Zhang
相关产品推荐
相关产品推荐

