3 回答
TA贡献1829条经验 获得超9个赞
我为自己想出了以下功能:
import dill
from pathlib import Path
import torch
from torchtext.data import Dataset
def save_dataset(dataset, path):
if not isinstance(path, Path):
path = Path(path)
path.mkdir(parents=True, exist_ok=True)
torch.save(dataset.examples, path/"examples.pkl", pickle_module=dill)
torch.save(dataset.fields, path/"fields.pkl", pickle_module=dill)
def load_dataset(path):
if not isinstance(path, Path):
path = Path(path)
examples = torch.load(path/"examples.pkl", pickle_module=dill)
fields = torch.load(path/"fields.pkl", pickle_module=dill)
return Dataset(examples, fields)
并不是说实际对象可能会有所不同,例如,如果保存TabularDataset,则load_dataset返回 class 的实例Dataset。这不太可能影响数据管道,但可能需要额外努力进行测试。在自定义标记器的情况下,它也应该是可序列化的(例如,没有 lambda 函数等)。
TA贡献1831条经验 获得超10个赞
您始终可以使用 pickle 转储对象,但请记住,模块不会处理转储字典或字段对象列表,因此最好先尝试分解列表
将 DataSet 对象存储到 pickle 文件以便以后轻松加载
def save_to_pickle(dataSetObject,PATH):
with open(PATH,'wb') as output:
for i in dataSetObject:
pickle.dump(vars(i), output, pickle.HIGHEST_PROTOCOL)
最艰难的事情还没有到来,是的,加载泡菜文件....;)
首先,尝试查找所有字段名称和字段属性,然后进行kill
将 pickle 文件加载到 DataSetObject 中
def load_pickle(PATH, FIELDNAMES, FIELD):
dataList = []
with open(PATH, "rb") as input_file:
while True:
try:
# Taking the dictionary instance as the input Instance
inputInstance = pickle.load(input_file)
# plugging it into the list
dataInstance = [inputInstance[FIELDNAMES[0]],inputInstance[FIELDNAMES[1]]]
# Finally creating an example objects list
dataList.append(Example().fromlist(dataInstance,fields=FIELD))
except EOFError:
break
# At last creating a data Set Object
exampleListObject = Dataset(dataList, fields=data_fields)
return exampleListObject
这个 hackish 解决方案在我的情况下有效,希望你会发现它对你的情况也有用。
顺便说一句,欢迎任何建议:)。
添加回答
举报