2017-02-19 21 views
3

У меня есть данные, которые имеют различные разговоры между двумя людьми. Каждое предложение имеет некоторый тип классификации. Я пытаюсь использовать сеть NLP для классификации каждого предложения беседы. Я попробовал сеть сверток и получил приличные результаты (не измельчаю). Я подумал, что, поскольку этот разговор назад и вперед и сеть LSTM могут давать лучшие результаты, поскольку сказанное ранее может оказать большое влияние на последующие.Как структурировать нейронную сеть LSTM для классификации

Type of RNN nets

Если я следовать структуре выше, я предположил бы, что я делаю многие-ко-многим. Мои данные выглядят.

X_train = [[sentence 1], 
      [sentence 2], 
      [sentence 3]] 
Y_train = [[0], 
      [1], 
      [0]] 

Данные обработаны с использованием word2vec. Я тогда строить свою сеть следующим образом ..

model = Sequential()  
model.add(Embedding(len(vocabulary),embedding_dim, 
      input_length=X_train.shape[1])) 
model.add(LSTM(88)) 
model.add(Dense(1,activation='sigmoid')) 
model.compile(optimizer='rmsprop',loss='binary_crossentropy', 
       metrics['accuracy']) 
model.fit(X_train,Y_train,verbose=2,nb_epoch=3,batch_size=15) 

Я предполагаю, что эта установка будет кормить одну партию предложений в одновременно. Однако, если в model.fit, shuffle не равен false, то его получение перетасовывает партии, так почему же сеть LSTM даже полезна в этом случае? Из исследований по этой теме, чтобы достичь многие-ко-многим структуры можно было бы необходимо изменить LSTM слой слишком

model.add(LSTM(88,return_sequence=True)) 

и выходной слой должен был бы быть ...

model.add(TimeDistributed(Dense(1,activation='sigmoid'))) 

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

Любой вход был бы оценен. Или, если у вас есть предложения по лучшему методу, я более чем счастлив услышать их!

ответ

3

Ваша первая попытка была хороша. Перетасовка происходит между предложениями, единственное перетасовка между образцами обучения, чтобы они не всегда приходили в одном порядке. Слова внутри предложений не перетасовываются.

Возможно, я не понял вопрос правильно?

EDIT:

После лучшего понимания вопроса, вот мое предложение.

Подготовка данных: Вы порезать свой корпус в блоках n предложений (они могут пересекаться). Вы должны иметь такую ​​форму, как (number_blocks_of_sentences, n, number_of_words_per_sentence), так что в основном список 2D-массивов, содержащих блоки из n предложений. n не должен быть слишком большим, поскольку LSTM не может обрабатывать огромное количество элементов в последовательности при обучении (исчезающий градиент). Ваши цели должны быть массивом формы (number_blocks_of_sentences, n, 1), а также список 2D-массивов, содержащих класс каждого предложения в вашем блоке предложений.

Модель:

n_sentences = X_train.shape[1] # number of sentences in a sample (n) 
n_words = X_train.shape[2]  # number of words in a sentence 

model = Sequential() 
# Reshape the input because Embedding only accepts shape (batch_size, input_length) so we just transform list of sentences in huge list of words 
model.add(Reshape((n_sentences * n_words,),input_shape = (n_sentences, n_words))) 
# Embedding layer - output shape will be (batch_size, n_sentences * n_words, embedding_dim) so each sample in the batch is a big 2D array of words embedded 
model.add(Embedding(len(vocabaulary), embedding_dim, input_length = n_sentences * n_words)) 
# Recreate the sentence shaped array 
model.add(Reshape((n_sentences, n_words, embedding_dim))) 
# Encode each sentence - output shape is (batch_size, n_sentences, 88) 
model.add(TimeDistributed(LSTM(88))) 
# Go over lines and output hidden layer which contains info about previous sentences - output shape is (batch_size, n_sentences, hidden_dim) 
model.add(LSTM(hidden_dim, return_sequence=True)) 
# Predict output binary class - output shape is (batch_size, n_sentences, 1) 
model.add(TimeDistributed(Dense(1,activation='sigmoid'))) 
... 

Это должно быть хорошим началом.

Я надеюсь, что это поможет

+0

Так вы говорите, что уровень LSTM будет получать по одному слову за раз? Итак, хотя предложение перетасовывается, каждое слово в предложении передается в LSTM отдельно, чтобы узнать общий контекст между предложением в целом? – DJK

+0

Если я не правильно сформулировал свой вопрос, извините. Поскольку данные являются разговором, то, что было сказано в предыдущем предложении, имеет вес в следующем предложении. Поэтому я пытаюсь настроить сеть, чтобы изучить поток разговоров и классифицировать каждое предложение. Вот почему я пытался использовать return_sequence, поэтому сеть будет хранить информацию о предыдущем предложении, классифицируя текущее предложение. – DJK

+0

LSTM подает последовательность векторов. В вашем случае это последовательность вложений слов. Он вернет вектор длины 88 для каждого предложения в вашем случае, который вы уменьшите до 1output с плотным слоем. Таким образом, это касается только одного предложения за раз. Это то, что вы сейчас делаете. Это то, что вы хотели сделать? –