Нейронная сеть LSTM с двумя источниками данных - PullRequest
0 голосов
/ 27 октября 2018

У меня есть следующая конфигурация: Одна сеть lstm, которая получает текст с n-граммами размером 2. Ниже простой схемы:

enter image description here

После некоторых тестов я заметил, что для некоторых классов у меня наблюдается значительный рост точности, когда я использую ngram с размером 3. Теперь я хочу обучить новую нейронную сеть LSTM с обоими размерами ngram одновременно, как показано на следующей схеме:

enter image description here

Как я могу предоставить данные и построить эту модель, используя keras для выполнения этой задачи?

1 Ответ

0 голосов
/ 29 октября 2018

Я полагаю, у вас уже есть функция для разбиения слов на n-граммы, так как у вас уже работает модель 2-грамма и 3-грамма?Для этого я просто создаю один пример слова «круто» для рабочего примера.Мне пришлось использовать встраивание для моего примера, так как слой LSTM с 26 ^ 3 = 17576 узлами был слишком сложным для моего компьютера.Я ожидаю, что вы сделали то же самое в своем 3-граммовом коде?

Ниже приведен полный рабочий пример:

from tensorflow.keras.layers import Input, Embedding, LSTM, Dense, concatenate
from tensorflow.keras.models import Model
import numpy as np

# c->2 o->14 o->14 l->11
np_2_gram_in = np.array([[26*2+14,26*14+14,26*14+11]])#co,oo,ol
np_3_gram_in = np.array([[26**2*2+26*14+14,26**2*14+26*14+26*11]])#coo,ool

np_output = np.array([[1]])

output_shape=1
lstm_2_gram_embedding = 128
lstm_3_gram_embedding = 192

inputs_2_gram = Input(shape=(None,))
em_input_2_gram = Embedding(output_dim=lstm_2_gram_embedding, input_dim=26**2)(inputs_2_gram)
lstm_2_gram = LSTM(lstm_2_gram_embedding)(em_input_2_gram)
inputs_3_gram = Input(shape=(None,))
em_input_3_gram = Embedding(output_dim=lstm_3_gram_embedding, input_dim=26**3)(inputs_3_gram)
lstm_3_gram = LSTM(lstm_3_gram_embedding)(em_input_3_gram)
concat = concatenate([lstm_2_gram, lstm_3_gram])
output = Dense(output_shape,activation='sigmoid')(concat)

model = Model(inputs=[inputs_2_gram, inputs_3_gram], outputs=[output])
model.compile(optimizer='adam', loss='binary_crossentropy')

model.fit([np_2_gram_in, np_3_gram_in], [np_output], epochs=5)
model.predict([np_2_gram_in,np_3_gram_in])
...