Слияние встраивания последовательности с функциями временного ряда - PullRequest
0 голосов
/ 02 ноября 2018

У меня проблемы с некоторыми аспектами Keras реализации LSTM . Это описание моей проблемы:

Я пытаюсь обучить модели предсказанию правильности слов. Моя модель имеет два типа входов:

  1. последовательность слов (предложение)
  2. И последовательность векторов признаков (для каждого слова я вычисляю победителя признаков из 6).

например,

input_1 = ['we', 'have', 'two', 'review'] input_2 = [[1.25, 0.01, 0.000787, 5.235, 0.0, 0.002091], [ 0.0787, 0.02342, 5.4595, 0.002091, 0.003477, 0.0], [0.371533, 0.529893, 0.371533, 0.6, 0.0194156, 0.003297],[0.471533, 0.635, 0.458, 0.7, 0.0194156, 0.0287]] gives output = [1, 1, 2, 1]

Поскольку каждое предложение в моем обучающем наборе имеет разную длину, я должен обнулить все предложения так, чтобы они все имели одинаковую длину.

Мой вопрос: как насчет второго ввода, я должен делать отступы! и как? поскольку они являются векторами.

Архитектура модели:

input1 = Input(shape=(seq_length,), dtype='int32')
emb = Embedding(input_dim=num_words, output_dim = num_dimension, 
input_length=seq_length, weights=[embeddings], mask_zero=True,trainable=False)(input_layer)

input2 = Input(shape=(seq_length,6 ))
x = keras.layers.concatenate([emb, input2],axis=2)

lstm = LSTM(64, return_sequences=True)(x)
ackwards = LSTM(128, return_sequences=True, go_backwards=True)(x)

common = merge([forwards, backwards], mode='concat', concat_axis=-1)
out = TimeDistributed(Dense(no_targets, activation='softmax'))(lstm)

1 Ответ

0 голосов
/ 02 ноября 2018

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

# Input 1
X1 = [[12, 34, 3], [6, 7, 0]] # where numbers are word indices and 0 is padding
# Input 2
X2 = [[[1.23,...,2.4], [1.24, ...], [0.6, ...]], [[3.25, ...], [2.4, ...], [0,0,0,0,0]]]
# So the padded words get zero feature vectors as well and the shapes match

Но не бойтесь, потому что вы объединяете emb с input2, mask_zero=True также распространяется на связанный вектор, так что LSTM фактически игнорирует заполнение со второго входа.

...