如何从训练 Pytorch 和 PytorchText 模型进行预测?

How to make prediction from train Pytorch and PytorchText model?

一般来说,在我用 Pytorch 成功训练了一个文本 RNN 模型后,使用 PytorchText 来利用原始源上的数据加载,我想用其他数据集进行测试(一种眨眼测试)来自来源不同但文本格式相同。

首先我定义了一个class来处理数据加载。

class Dataset(object):
    def __init__(self, config):
        # init what I need

    def load_data(self, df: pd.DataFrame, *args):
        # implementation below
        # Data format like `(LABEL, TEXT)`

    def load_data_but_error(self, df: pd.DataFrame):
        # implementation below
        # Data format like `(TEXT)`

这是 load_data 的详细信息,我加载了训练成功的数据。

TEXT = data.Field(sequential=True, tokenize=tokenizer, lower=True, fix_length=self.config.max_sen_len)
LABEL = data.Field(sequential=False, use_vocab=False)

datafields = [(label_col, LABEL), (data_col, TEXT)]

# split my data to train/test
train_df, test_df = train_test_split(df, test_size=0.33, random_state=random_state)

train_examples = [data.Example.fromlist(i, datafields) for i in train_df.values.tolist()]
train_data = data.Dataset(train_examples, datafields)

# split train to train/val
train_data, val_data = train_data.split(split_ratio=0.8)

# build vocab
TEXT.build_vocab(train_data, vectors=Vectors(w2v_file))
self.word_embeddings = TEXT.vocab.vectors
self.vocab = TEXT.vocab

test_examples = [data.Example.fromlist(i, datafields) for i in test_df.values.tolist()]
test_data = data.Dataset(test_examples, datafields)

self.train_iterator = data.BucketIterator(
            (train_data),
            batch_size=self.config.batch_size,
            sort_key=lambda x: len(x.title),
            repeat=False,
            shuffle=True)

self.val_iterator, self.test_iterator = data.BucketIterator.splits(
    (val_data, test_data),
    batch_size=self.config.batch_size,
    sort_key=lambda x: len(x.title),
    repeat=False,
    shuffle=False)

接下来是我的代码(load_data_but_error)加载其他源但导致错误

TEXT = data.Field(sequential=True, tokenize=tokenizer, lower=True, fix_length=self.config.max_sen_len)
datafields = [('title', TEXT)]

examples = [data.Example.fromlist(i, datafields) for i in df.values.tolist()]
blink_test = data.Dataset(examples, datafields)

self.blink_test = data.BucketIterator(
    (blink_test),
    batch_size=self.config.batch_size,
    sort_key=lambda x: len(x.title),
    repeat=False,
    shuffle=True)

当我执行代码时,我遇到了一个错误 AttributeError: 'Field' object has no attribute 'vocab',它在 处有一个问题,但它不喜欢我的情况,因为这里我有来自 load_data 的词汇和我想用它来做眨眼测试。

我的问题是,使用经过训练的 PyTorch 模型加载和提供新数据以测试当前模型的正确方法是什么?

我需要的是

  1. TEXT 保留在 load_data 中,并通过分配给 class 变量在 load_data_but_error 中重复使用
  2. load_data_but_error 函数
  3. 上将 train=True 添加到对象 data.BucketIterator

不太确定,但考虑到您已经重新定义了 TEXT,您将不得不再次明确地为您的字段 TEXT 创建词汇表。这可以按如下方式完成:

TEXT.build_vocab(examples, min_freq = 2)

此特定语句仅在数据集中至少出现两次时才将数据中的单词添加到词汇表中 examples,您可以根据需要更改它。

您可以在 https://torchtext.readthedocs.io/en/latest/data.html#torchtext.data.Field.build_vocab 阅读有关 build_vocab 方法的信息。