Q1) Почему мы передали вектор вложения слов (300 dim) в качестве весов в
Слой встраивания LSTM?
Очень упрощенно, вы можете представить встраиваемые слои как справочную таблицу, которая преобразует слово (представленное его индексом в словаре) в вектор. Это обучаемые слои. Поскольку вы уже обучили встраиванию слов вместо инициализации слоя встраивания со случайным весом, вы инициализируете его с помощью векторов, которые вы изучили.
Embedding(len(word_index)+1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
Итак, вот и вы
- создание встраиваемого слоя или справочной таблицы, которая может искать слова
индексы от 0 до len (word_index).
- Каждое найденное слово сопоставляется с вектором размером 300.
- Эта таблица поиска загружена векторами из "embedding_matrix"
(которая является предварительно обученной моделью).
- trainable = False замораживает вес в этом слое.
Вы прошли 300, потому что это векторный размер вашей предварительно обученной модели (embedding_matrix)
Q2) Как мы можем узнать оптимальное количество нейронов в слое LSTM?
Вы создали слой LSTM с вектором размера 300 в качестве входных данных и возвращают вектор размером 300. Выходной размер и количество уложенных LSTMS представляют собой гиперпараметры, которые настраиваются вручную (обычно с использованием KFold CV)
Q3) Можете ли вы объяснить, как обработка отдельной записи в LSTM
Алгоритм
- Отдельная запись / предложение (я) преобразуются в индексы словаря. Таким образом, для каждого предложения у вас есть массив индексов.
- Пакет из этих предложений создается и подается в качестве входных данных для модели.
- LSTM разворачивается, передавая по одному индексу за раз в качестве входных данных на каждом шаге.
- Наконец, выходной сигнал LSTM передается в прямом направлении конечной плотной
слой до размера 33. Таким образом, похоже, что каждый вход сопоставлен с одним из 33
занятия в вашем случае.
Простой пример
import numpy as np
from keras.preprocessing.text import one_hot
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten, LSTM
from keras.layers.embeddings import Embedding
from nltk.lm import Vocabulary
from keras.utils import to_categorical
training_data = [ "it was a good movie".split(), "it was a bad movie".split()]
training_target = [1, 0]
v = Vocabulary([word for s in training_data for word in s])
model = Sequential()
model.add(Embedding(len(v),50,input_length = 5, dropout = 0.2))
model.add(LSTM(10, dropout_U = 0.2, dropout_W = 0.2))
model.add(Dense(2,activation='softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer='adam',metrics = ['accuracy'])
print(model.summary())
x = np.array([list(map(lambda x: v[x], s)) for s in training_data])
y = to_categorical(training_target)
model.fit(x,y)