Следуя факелому тексту Учебное пособие по анализу настроений , я построил две модели, использующие одну и ту же архитектуру модели, для двух разных входных наборов данных.
Теперь я хочу проверить их производительность на одном наборе тестов. (кроме теории, это часть моего варианта использования), после того, как я сохранил модели. Данные обучения и тестовые данные поступают из отдельных файлов 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-файле. Если я затем захочу использовать тот же набор тестов на моей второй модели, обученной на другом тренировочном наборе, мне придется повторить все вышеописанное.
Мой вопрос: есть ли более быстрый / лучший способ обеспечить, чтобы словарь для тестовых данных соответствовал тому, который использовался во время обучения? Особенно если учесть, что я хочу обучить две модели на отдельных наборах данных, а затем использовать один и тот же набор тестов для двух моделей.
Обратите также внимание, что если начальное значение в разделении поезд / вал изменилось, или если я Если бы он не был установлен, это не сработало бы, потому что в обучающем словаре могли бы появиться другие слова, что делает невозможным воспроизведение во время теста, если не задано начальное число.