Используйте предварительно обученное вложение на испанском языке с 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.