加载IMDB数据集时遇DILL_AVAILABLE导入错误如何解决?
解决torchtext加载IMDB数据集时的ImportError问题
原因分析
这个错误是由于torchtext与PyTorch版本不兼容导致的,DILL_AVAILABLE变量在较新版本的PyTorch数据管道模块中已被移除或变更位置,而旧版torchtext仍在尝试调用它。
解决方案
以下是几种可行的解决方法:
方法1:匹配兼容的版本组合
- 若使用PyTorch 2.0+,建议安装对应兼容的torchtext版本,比如
torchtext==0.15.2(适配PyTorch 2.0.x),执行命令:pip install torchtext==0.15.2 --force-reinstall - 若坚持使用旧版torchtext,可降级PyTorch到对应兼容版本,比如PyTorch 1.13.x搭配torchtext 0.14.x
方法2:改用torchdata加载数据集
新版PyTorch推荐使用torchdata替代旧版torchtext的数据集加载方式,示例代码如下:
from torchdata.datapipes.iter import IterableWrapper import os import tarfile # 下载并解压IMDB数据集(如果未下载) data_root = os.path.expanduser('~/datasets') imdb_tar_path = os.path.join(data_root, 'aclImdb_v1.tar.gz') if not os.path.exists(imdb_tar_path): from torchdata.datapipes.iter import HttpReader url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz" dp = HttpReader([url]) with open(imdb_tar_path, 'wb') as f: for chunk in dp: f.write(chunk) # 读取数据集 def load_imdb_split(split='train'): tar = tarfile.open(imdb_tar_path, 'r:gz') split_dir = f'aclImdb/{split}' data = [] for label in ['pos', 'neg']: label_dir = f'{split_dir}/{label}' for member in tar.getmembers(): if member.name.startswith(label_dir) and member.name.endswith('.txt'): f = tar.extractfile(member) text = f.read().decode('utf-8') data.append((text, 1 if label == 'pos' else 0)) tar.close() return IterableWrapper(data) train_iter = load_imdb_split('train')
方法3:手动修改torchtext源码(临时应急,不推荐)
找到报错的torchtext相关模块文件,将引用from torch.utils.data.datapipes.utils.common import DILL_AVAILABLE替换为:
try: from torch.utils.data.datapipes.utils.common import DILL_AVAILABLE except ImportError: import dill DILL_AVAILABLE = dill is not None
该方法会修改第三方库源码,后续更新库时会被覆盖,仅作临时方案。
内容的提问来源于stack exchange,提问作者Sazzad Hissain Khan
相关产品推荐
相关产品推荐

