Как получить векторы слов из слоя встраивания Keras

В настоящее время я работаю с моделью Keras, в которой слой встраивания является первым слоем. Чтобы визуализировать отношения и сходство слов между собой, мне нужна функция, которая возвращает отображение слов и векторов каждого элемента в словаре (например, «любовь» - [0,21, 0,56, ..., 0,65, 0,10] ).

Есть ли способ это сделать?


person philszalay    schedule 08.07.2018    source источник


Ответы (1)


Вы можете получить слово embeddings, используя метод get_weights() слоя внедрения (т.е., по сути, веса слоя внедрения являются векторами внедрения):

# if you have access to the embedding layer explicitly
embeddings = emebdding_layer.get_weights()[0]

# or access the embedding layer through the constructed model 
# first `0` refers to the position of embedding layer in the `model`
embeddings = model.layers[0].get_weights()[0]

# `embeddings` has a shape of (num_vocab, embedding_dim) 

# `word_to_index` is a mapping (i.e. dict) from words to their index, e.g. `love`: 69
words_embeddings = {w:embeddings[idx] for w, idx in word_to_index.items()}

# now you can use it like this for example
print(words_embeddings['love'])  # possible output: [0.21, 0.56, ..., 0.65, 0.10]
person today    schedule 08.07.2018
comment
с этой строкой 'words_embeddings = {w: embeddings [idx] для w, idx в tokenizer.word_index}' я получаю следующее исключение: IndexError: только целые числа, срезы (:), многоточие (...), numpy.newaxis (None) а целочисленные или логические массивы - допустимые индексы. tokenizer.word_index возвращает отображение слов в их индекс. - person philszalay; 10.07.2018
comment
@dermaschder Я думаю, вы забыли вызвать items() в словаре, то есть tokenizer.word_index.items(). - person today; 10.07.2018
comment
Не забудьте добавить специальный символ на тот случай, если вы добавите заполнение в свой ввод для некоторых случаев использования, таких как LSTM. Вы также можете добавить индекс для заполнения, например word_to_index['__padding__'] = 0 - person Vaibhav; 17.01.2019
comment
@today, встраивание в Keras статическое или динамическое (иногда называемое контекстным встраиванием)? - person A.B; 02.07.2021
comment
@ A.B. Если вы имеете в виду контекстуализированные и неконтекстные вложения, то это никак не связано с Keras или используемой вами структурой DL. Вместо этого это связано с методом или алгоритмом, который вы используете. Слой внедрения сам по себе является только таблицей поиска: при целочисленном индексе он возвращает вектор, соответствующий этому индексу. Именно вы, как разработчик метода или архитектуры модели, решаете использовать ее таким образом, чтобы модель давала вам контекстуализированные или неконтекстные вложения. - person today; 02.07.2021
comment
Спасибо @today, целочисленная часть индекса имеет смысл. возвращаемый им плотный вектор обучения, является ли он более близким к статическому встраиванию или контекстуализированному / динамическому. Если я выучу их с помощью tssk прогнозирования lstm, будут ли они контекстуализированы? - person A.B; 02.07.2021
comment
@ A.B Контекстуализированные вложения не достигаются с помощью только одного слоя встраивания; это архитектура модели (помимо слоя внедрения), которая создает контекстуализированные вложения. Значения в слое embd фиксированы (после обучения), и поэтому для двух предложений, таких как банковский счет и берег реки, вектор, созданный слоем embd для банка слов, точно такой же для этих двух предложений. Таким образом, вы должны добавить другие слои, будь то слои RNN или Transformer, поверх, чтобы создавать контекстные вставки (в качестве выходных данных этих слоев, а не слоя вставки). - person today; 02.07.2021
comment
Большое спасибо @today. Это имеет смысл и было действительно полезно :) - person A.B; 02.07.2021
comment
Как я могу импортировать emebdding_layer? Он говорит, что emebdding_layer не определен. Я не нашел его в документации. Я тоже думаю, что это опечатка - person Guilherme Parreira; 07.07.2021