Обучение последовательностям предложений с использованием Keras

window.event не является особенностью, это ошибка!

Цитата MDN :

window.event является запатентованным Microsoft Internet Explorer, доступное только при вызове обработчика событий DOM. Его значение - это объект Event, который в настоящее время обрабатывается.

И самое главное:

Не является частью какой-либо спецификации.

window.event является нестандартным, поэтому не ожидайте, что будут поддерживаться любые браузеры .

Первым параметром функции обратного вызова в element.addEventListener() является объект Event , Используйте его вместо window.event.

4
задан Michael George 13 July 2018 в 20:05
поделиться

1 ответ

Итак, насколько я понял, у вас есть последовательность максимум 50 событий, на которые вы хотите сделать прогнозы. Эти события имеют прикрепленные текстовые данные, которые можно рассматривать как другую последовательность вложений слов.

Я бы предложил решение, которое включает в себя LSTM для текстовой части 1D-свертку для «реальной» части последовательности. Каждый слой LSTM объединяется с числовыми данными. Это включает в себя 50 слоев LSTM, которые могут потребовать много времени для обучения, даже если вы используете общие веса. Также возможно использовать только слои свертки для текстовой части, которая выполняется быстрее, но не моделирует долгосрочные зависимости. (У меня есть опыт, что эти долгосрочные зависимости часто не так важны для интеллектуального анализа текста).

Текст -> LSTM или 1DConv -> concat с числовыми данными -> 1DConv -> Выходные данные Вот какой код exmaple, который показывает, как использовать весы осколков

numeric_input = Input(shape=(x_numeric_train.values.shape[1],), name='numeric_input')
nlp_seq = Input(shape=(number_of_messages ,seq_length,), name='nlp_input'+str(i))

# shared layers
emb = TimeDistributed(Embedding(input_dim=num_features, output_dim=embedding_size,
                input_length=seq_length, mask_zero=True,
                input_shape=(seq_length, )))(nlp_seq)    
x = TimeDistributed(Bidirectional(LSTM(32, dropout=0.3, recurrent_dropout=0.3, kernel_regularizer=regularizers.l2(0.01))))(emb)      

c1 = Conv1D(filter_size, kernel1, padding='valid', activation='relu', strides=1, kernel_regularizer=regularizers.l2(kernel_reg))(x)
p1 = GlobalMaxPooling1D()(c1)
c2 = Conv1D(filter_size, kernel2, padding='valid', activation='relu', strides=1, kernel_regularizer=regularizers.l2(kernel_reg))(x)
p2 = GlobalMaxPooling1D()(c2)
c3 = Conv1D(filter_size, kernel3, padding='valid', activation='relu', strides=1, kernel_regularizer=regularizers.l2(kernel_reg))(x)
p3 = GlobalMaxPooling1D()(c3)

x = concatenate([p1, p2, p3, numeric_input])    
x = Dense(1, activation='sigmoid')(x)        
model = Model(inputs=[nlp_seq, meta_input] , outputs=[x])
model.compile('adam', 'binary_crossentropy', metrics=['accuracy'])    

И training:

model.fit([x_train, x_numeric_train], y_train)
# where x_train is a a array of num_samples * num_messages * seq_length

Для такой сложной модели требуется много данных для сближения. Для меньшего количества данных более простое решение может быть реализовано путем агрегирования событий, чтобы иметь только одну последовательность. Например, текстовые данные всех событий можно рассматривать как один единственный текст (с маркером разделителя) вместо нескольких текстов, в то время как числовые данные могут быть суммированы, усреднены или даже объединены в список фиксированной длины. Но это зависит от ваших данных.

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

0
ответ дан Digital-Thinking 17 August 2018 в 12:10
поделиться
  • 1
    Спасибо @ Digital-Thinking за вашу помощь. Будет ли TimeDistributed делать по сути то же самое? Из того, что я понял из документации, слой TimeDistributed применяет целевой слой к каждому фрагменту ввода. Для меня это означает, что модель автоматически создаст слой LSTM для каждого предупреждения в последовательности, которая выполняет то же самое, что и цикл for в приведенном выше коде. – Michael George 17 July 2018 в 15:10
  • 2
    Очень хороший намек! Я думаю, что TimeDistributed также работает, но данные ввода должны быть в правильном формате. Я обновлю ответ завтра – Digital-Thinking 17 July 2018 в 20:25
Другие вопросы по тегам:

Похожие вопросы: