关于使用 Huggingface 中 datasets 库时,代码正确、运行报错的原理解析与解决方法
在使用 Huggingface 的 datasets 库创建和处理数据集时,你可能会遇到一种非常诡异的情况:代码看似正确,但运行时却报错,或者运行后没有生成预期结果。这篇博客将详细剖析这种问题的原因,并提供解决方案。
背景
我们在使用 datasets 库中的 GeneratorBasedBuilder 创建数据文件时,需要重写一些方法,例如 download_and_prepare 和 as_dataset。以下是一个典型的代码示例:
def _split_generators(self):
"""返回SplitGenerators。"""
return [
SplitGenerator(
name=Split.TRAIN,
gen_kwargs={
"archives": _DATA_URL["train"],
"split": "train",
},
),
SplitGenerator(
name=Split.VALIDATION,
gen_kwargs={
"archives": _DATA_URL["val"],
"split": "validation",
}
)
]
在这个示例中,我们已经定义了 train 和 validation 两种数据文件。但在运行以下代码时,依然会报错:
train_dataset = imagenet_builder.as_dataset(split="train")
ValueError: Unknown split "train". Should be one of ['validation'].
原因剖析
出现这种情况的原因是 datasets 库在运行后会生成默认的配置文件,通常保存在家目录的 .cache/huggingface/datasets 文件夹下面。当你再次运行含 datasets 库的源代码时,程序会直接使用之前生成的默认配置,而不是当前程序的设置。这就导致了即使代码已经正确修改,但运行结果却报错或者没有预期的结果。
解决方案
要解决这个问题,你需要删除生成的默认配置文件夹,让程序重新生成配置并使用当前代码的设置。具体步骤如下:
找到并删除默认配置文件夹:~/.cache/huggingface/datasetsrm -rf
重新运行你的 Python 代码:
train_dataset =imagenet_builder.as_dataset(split="train")
这样,程序会重新生成配置并使用当前代码的设置,问题就会得到解决。
总结
在使用 Huggingface 的 datasets 库时,如果遇到代码正确但运行报错或没有预期结果的问题,可能是因为程序在使用之前生成的默认配置文件。通过删除这些配置文件,程序会重新生成配置并使用当前代码的设置,从而解决问题。