Ожидаемый вход в факел - PullRequest
       32

Ожидаемый вход в факел

0 голосов
/ 12 февраля 2019

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

import gensim
from torch import nn

model = gensim.models.KeyedVectors.load_word2vec_format('path/to/file')
weights = torch.FloatTensor(model.vectors)
emb = nn.Embedding.from_pretrained(torch.FloatTensor(weights.vectors))

Это, кажется, работает правильно, также на 1.0.1.Мой вопрос в том, что я не совсем понимаю, что я должен подавать в такой слой, чтобы использовать его.Могу ли я просто накормить токены (сегментированное предложение)?Нужно ли мне сопоставление, например токен-индекс?

Я обнаружил, что вы можете получить доступ к вектору токена просто с помощью чего-то вроде

print(weights['the'])
# [-1.1206588e+00  1.1578362e+00  2.8765252e-01 -1.1759659e+00 ... ]

Что это значит для архитектуры RNN?Можем ли мы просто загрузить токены последовательностей пакетов?Например:

for seq_batch, y in batch_loader():
    # seq_batch is a batch of sequences (tokenized sentences)
    # e.g. [['i', 'like', 'cookies'],['it', 'is', 'raining'],['who', 'are', 'you']]
    output, hidden = model(seq_batch, hidden)

Это не похоже на работу, поэтому я предполагаю, что вам нужно преобразовать токены в его индекс в окончательной модели word2vec.Это правда?Я обнаружил, что вы можете получить индексы слов, используя vocab модели word2vec:

weights.vocab['world'].index
# 147

Так что в качестве входных данных для слоя Embedded я должен предоставить тензор int для последовательностипредложения, которые состоят из последовательности слов?Пример использования с фиктивным загрузчиком данных (см. Пример выше) и фиктивным приветствием RNN.

1 Ответ

0 голосов
/ 13 февраля 2019

В документации говорится следующее

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

Поэтому, если вы хотите вставить предложение, вы даете LongTensor of индексов, каждый из которых соответствуетслово в словаре, которое слой nn.Embedding будет отображать в векторах слов в дальнейшем.

Вот иллюстрация

test_voc = ["ok", "great", "test"]
# The word vectors for "ok", "great" and "test"
# are at indices, 0, 1 and 2, respectively.

my_embedding = torch.rand(3, 50)
e = nn.Embedding.from_pretrained(my_embedding)

# LongTensor of indicies corresponds to a sentence,
# reshaped to (1, 3) because batch size is 1
my_sentence = torch.tensor([0, 2, 1]).view(1, -1)

res = e(my_sentence)
print(res.shape)
# => torch.Size([1, 3, 50])
# 1 is the batch dimension, and there's three vectors of length 50 each

Что касается RNN, далее вы можете подать этот тензор в свой модуль RNN, например,

lstm = nn.LSTM(input_size=50, hidden_size=5, batch_first=True)
output, h = lstm(res)
print(output.shape)
# => torch.Size([1, 3, 5])

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

...