我正在遵循1.9 pytorch上发布的火炬文本转换器教程。但是,因为我正在使用Tegra TX2,所以我坚持使用torchtext 0.6.0,而不是0.10.0(我认为教程使用的是0.10.0)。
在本教程之后,将抛出一个错误:
data = [torch.tensor(vocab(tokenizer(item)), dtype=torch.long) for item in raw_text_iter]
return torch.cat(tuple(filter(lambda t: t.numel() > 0, data)))
错误是:
TypeError: 'Vocab' object is not callable
我明白错误的意思,我不知道的是,在这种情况下,这是Vocab
的预期回报吗?
查看TorchText 0.6.0的文档,我看到它有:
stoi
itos
freqs
vectors
该示例是否期望Vocab
中的vectors
?
编辑:我查了0.10.0文档,它没有__call__
。
查看0.10.0中Vocab
实现的源代码,显然它是torch.nn.Module
的子类,这意味着它从那里继承了__call__
(调用它大致相当于调用它的forward()
方法,但有一些额外的机制来实现钩子等)。
我们还可以看到它封装了一些底层的VocabPyBind
对象(相当于旧版本中的Vocab
类),并且它的forward()
方法只是调用它的lookup_indices
方法。
所以简而言之,在旧版本的标准库中,似乎等效的是调用vocab.lookup_indices(tokenizer(item))
。
更新:显然,在0.6.0中,Vocab
类甚至没有lookup_indices
方法,但阅读源代码,这相当于:
[vocab[token] for token in tokenizer]
如果您能够升级,为了向前兼容,您可以编写这样的包装器:
from torchtext.vocab import Vocab as _Vocab
class Vocab(_Vocab):
def lookup_indices(self, tokens):
return [vocab[token] for token in tokens]
def __call__(self, tokens):
return self.lookup_indices(tokens)