Используйте встроенное обучение на испанском языке с Torchtext - PullRequest
0 голосов
/ 07 сентября 2018

Я использую Torchtext в проекте НЛП. У меня есть предтренированное встраивание в мою систему, которое я хотел бы использовать. Поэтому я попробовал:

my_field.vocab.load_vectors(my_path)

Но, по-видимому, по какой-то причине это принимает только имена краткого списка предварительно принятых вложений. В частности, я получаю эту ошибку:

Got string input vector "my_path", but allowed pretrained vectors are ['charngram.100d', 'fasttext.en.300d', ..., 'glove.6B.300d']

Я нашел людей с похожими проблемами , но решения, которые я могу найти до сих пор, это "изменить исходный код Torchtext", которого я бы предпочел избежать, если это вообще возможно.

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

Некоторые люди, кажется, думают, что неясно, что я впитываю. Итак, если заголовка и последнего вопроса недостаточно: «Мне нужна помощь с использованием предварительно обученного встраивания испанского слова в Torchtext».

1 Ответ

0 голосов
/ 11 сентября 2018

Оказывается, есть относительно простой способ сделать это без изменения исходного кода Torchtext. Вдохновение от этой Github-темы .

1. Создать тензорное слово-вектор

Вам нужно загрузить свое вложение, чтобы получить массивный массив с размерами (number_of_words, word_vector_length):

my_vecs_array [word_index] должен возвращать ваш соответствующий вектор слов.

ВАЖНО. Этот массив ДОЛЖЕН быть собран с использованием словарного словаря Torchtext (field.vocab.stoi). В противном случае Torchtext будет указывать на неправильные векторы!

Не забудьте преобразовать в тензор:

my_vecs_tensor = torch.from_numpy(my_vecs_array)

2. Загрузить массив в Torchtext

Я не думаю, что этот шаг действительно необходим из-за следующего, но он позволяет иметь поле Torchtext со словарем и векторами в одном месте.

my_field.vocab.set_vectors(my_field.vocab.stoi, my_vecs_tensor, word_vectors_length)

3. Передача веса на модель

В вашей модели вы объявите встраивание следующим образом:

my_embedding = toch.nn.Embedding(vocab_len, word_vect_len)

Затем вы можете загрузить свои веса, используя:

my_embedding.weight = torch.nn.Parameter(my_field.vocab.vectors, requires_grad=False)

Используйте require_grad = True, если вы хотите обучить встраивание, используйте False, если вы хотите заморозить его.

РЕДАКТИРОВАТЬ: Похоже, есть другой способ , который выглядит немного проще! Улучшение в том, что вы, очевидно, можете передавать предварительно обученные векторы слов непосредственно на этапе формирования словарного запаса, так что здесь выполняются шаги 1-2.

...