Обеспечение правильности словарного запаса в факелах - PullRequest
0 голосов
/ 29 апреля 2020

Следуя факелому тексту Учебное пособие по анализу настроений , я построил две модели, использующие одну и ту же архитектуру модели, для двух разных входных наборов данных.

Теперь я хочу проверить их производительность на одном наборе тестов. (кроме теории, это часть моего варианта использования), после того, как я сохранил модели. Данные обучения и тестовые данные поступают из отдельных файлов CSV.

Я на некоторое время застрял на том, как настроить словари для того, чтобы оба работали так, как ожидалось. Позвольте мне вкратце проиллюстрировать:

# All these are defined in the tutorial
model = RNN(INPUT_DIM, 
            EMBEDDING_DIM, 
            HIDDEN_DIM, 
            OUTPUT_DIM, 
            N_LAYERS, 
            BIDIRECTIONAL, 
            DROPOUT, 
            PAD_IDX)

# Load the saved model
model.load_state_dict(torch.load('model-1.pt'))

# Load test data

TEST_TEXT = Field(sequential=True, tokenize="basic_english", include_lengths = True)

TEST_LABEL = data.LabelField(dtype = torch.float)

test_fields = [('review', TEST_TEXT),
        ('sentiment', TEST_LABEL)]


test_reviews = TabularDataset(
    path='./test_examples.csv', format='csv',
    fields=test_fields,
    skip_header=False)

# Now I need to match the test data vocabulary to the data the model was trained on

REVIEWS_ONE_TEXT = Field(sequential=True, tokenize="basic_english", include_lengths = True)

REVIEWS_ONE_LABEL = data.LabelField(dtype = torch.float)

fields_one = [('review', REVIEWS_ONE_TEXT),
        ('sentiment', REVIEWS_ONE_LABEL)]

reviews_one = TabularDataset(
    path='./reviews-one.csv', format='csv',
    fields=fields_one,
    skip_header=True)

# Split training data into train/val, this was done at training time as well, using the same seed

import random

reviews_one_train_data, reviews_one_valid_data = reviews_one.split(
    split_ratio=[.9, .1], random_state = random.seed(SEED))

# Now I need to create the vocabs

# Create vocabs
MAX_VOCAB_SIZE = 25_000

REVIEWS_ONE_TEXT.build_vocab(reviews_one_train_data, 
                 max_size = MAX_VOCAB_SIZE, 
                 vectors = "glove.6B.100d", 
                 unk_init = torch.Tensor.normal_)

REVIEWS_ONE_LABEL.build_vocab(reviews_one_train_data)

# The I need to ensure the test data has the same vocab as what the model was trained on
TEST_TEXT.vocab = REVIEWS_ONE_TEXT.vocab

TEST_LABEL.vocab = REVIEWS_ONE_LABEL.vocab

# Only now can I call test and get correct results

# Create iterators
BATCH_SIZE = 64

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
test_iterator = data.BucketIterator(test_reviews, batch_size=BATCH_SIZE, sort=False, device = device)

Теперь это большой код, который мне нужно написать, чтобы протестировать модель в CSV-файле. Если я затем захочу использовать тот же набор тестов на моей второй модели, обученной на другом тренировочном наборе, мне придется повторить все вышеописанное.

Мой вопрос: есть ли более быстрый / лучший способ обеспечить, чтобы словарь для тестовых данных соответствовал тому, который использовался во время обучения? Особенно если учесть, что я хочу обучить две модели на отдельных наборах данных, а затем использовать один и тот же набор тестов для двух моделей.

Обратите также внимание, что если начальное значение в разделении поезд / вал изменилось, или если я Если бы он не был установлен, это не сработало бы, потому что в обучающем словаре могли бы появиться другие слова, что делает невозможным воспроизведение во время теста, если не задано начальное число.

...