我正在研究 CNN 情感分析机器学习模型,该模型使用 Torchtext 库提供的 IMDb 数据集。 在我的一行代码中
vocab = Vocab(counter, min_freq = 1, specials=('\<unk\>', '\<BOS\>', '\<EOS\>', '\<PAD\>'))
我收到 min_freq 参数的 TypeError,尽管我确定它是该函数可接受的参数之一。我还收到 UserWarning Lambda 函数不支持 pickle,请改用常规 python 函数或 functools partial。完整代码
from torchtext.datasets import IMDB
from collections import Counter
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import Vocab
tokenizer = get_tokenizer('basic_english')
train_iter = IMDB(split='train')
test_iter = IMDB(split='test')
counter = Counter()
for (label, line) in train_iter:
counter.update(tokenizer(line))
vocab = Vocab(counter, min_freq = 1, specials=('\<unk\>', '\<BOS\>', '\<EOS\>', '\<PAD\>'))
来源链接 走向数据科学 github 从旧到新
我尝试删除 min_freq 参数并使用默认函数如下
vocab = Vocab(counter, specials=('\<unk\>', '\<BOS\>', '\<EOS\>', '\<PAD\>'))
然而,我最终得到了相同类型的错误,但对于 specials 参数而不是 min_freq。
任何帮助将不胜感激
谢谢。
如https://github.com/pytorch/text/issues/1445所述,您应该将“Vocab”更改为“vocab”。我认为他们错过了旧笔记本到新笔记本的类型。
正确代码:
from torchtext.datasets import IMDB
from collections import Counter
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import vocab
tokenizer = get_tokenizer('basic_english')
train_iter = IMDB(split='train')
test_iter = IMDB(split='test')
counter = Counter()
for (label, line) in train_iter:
counter.update(tokenizer(line))
vocab = vocab(counter, min_freq = 1, specials=('\<unk\>', '\<BOS\>', '\<EOS\>', '\<PAD\>'))
我的环境:
您可以尝试使用 torchtext.legacy.vocab 而不是 torchtext.vocab,这可能会解决问题。这对我有用:
from torchtext.datasets import IMDB
from collections import Counter
from torchtext.data.utils import get_tokenizer
from torchtext.legacy.vocab import vocab
对不起,这对我不起作用。 :( Vocab 是对象的正确名称,而 vocab 不是。
我找到的简单解决方案是:“特价”元组已从实验性 Vocab 中删除,不再使用!就是这样。
https://github.com/pytorch/text/issues/890
我的环境:
python 3.8.16
torchtext 0.15.1
pytorch 2.0.0