Используйте предварительно обученное вложение на испанском языке с Torchtext

Я использую 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 ответ

Решение

Оказывается, есть относительно простой способ сделать это без изменения исходного кода 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.

Другие вопросы по тегам