Не удается отследить запись путем обработки записи в алгоритме LSTM для классификации текста? - PullRequest
0 голосов
/ 08 марта 2019

Мы работаем над многоклассовой классификацией текста, и мы используем следующий процесс:

1) Мы создали вектор 300 dim с вложением слова word2vec, используя наши собственные данные, а затем передали этот вектор каквес для встраивания слоя LSTM.

2) А затем мы использовали один слой LSTM и один плотный слой.

Вот мой код:

input_layer = layers.Input((train_seq_x.shape[1], ))

embedding_layer = layers.Embedding(len(word_index)+1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)

lstm_layer1 = layers.LSTM(300,return_sequences=True,activation="relu")(embedding_layer)
lstm_layer1 = layers.Dropout(0.5)(lstm_layer1)

flat_layer = layers.Flatten()(lstm_layer1)

output_layer = layers.Dense(33, activation="sigmoid")(flat_layer)

model = models.Model(inputs=input_layer, outputs=output_layer)
model.compile(optimizer=optimizers.Adam(), loss='categorical_crossentropy',metrics=['accuracy'])

Пожалуйстапомогите мне ответить на следующие вопросы:

Q1) Почему мы передавали вектор вложения слов (300 димов) в качестве весов в слое встраивания LSTM?

Q2) Как мы можем узнать оптимальное число нейронныхв слое LSTM?

Q3) Не могли бы вы объяснить, как обрабатывается отдельная запись в алгоритме LSTM?

Пожалуйста, дайте мне знать, если вам требуется больше информации об этом.

1 Ответ

1 голос
/ 08 марта 2019

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...