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

Я прочитал следующее сообщение в блоге и попытался реализовать его через Keras: https://andriymulyar.com/blog/bert-document-classification

Теперь я новичок в Керасе, и я не понимаю, как использовать «нейронные сети seq2seq» для сжатия последовательности подразделов (предложений) в глобальный вектор контекста (вектор документа). - через LSTM. .

Например: у меня есть 10 документов, каждый из которых состоит из 100 предложений, и каждое предложение представлено вектором 1x500. Итак, массив будет выглядеть так:

X = np.array(Matrix).reshape(10, 100, 500) # reshape to 10 documents with 100 sequence of 500 features

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

Однако самое сложное для меня - представить выходной вектор ... я просто перечисляю свои документы

y = [1,2,3,4,5,6,7,8,9,10]
y = np.array(y)

или мне нужно использовать выходные векторы с горячим кодированием:

yy = to_categorical(y)

или еще что-то ..?

Насколько я понимаю, итоговая модель должна выглядеть примерно так:

model = Sequential()
model.add(LSTM(50, input_shape=(100,500)))
model.add(Dense(1))
model.compile(loss='categorical_crossentropy',optimizer='rmsprop')
model.fit(X, yy, epochs=100, validation_split=0.2, verbose=1)

person Felix    schedule 24.12.2019    source источник


Ответы (1)


Это зависит только от используемых вами данных:

Для быстрого кодирования используйте Категориальную потерю кроссентропии.

model.compile(loss='categorical_crossentropy',optimizer='rmsprop')

Для кодирования меток используйте Редкую категориальную потерю кроссентропии.

model.compile(loss='sparse_categorical_crossentropy',optimizer='rmsprop')

Базовый подход одинаков для обеих версий. Итак, если у вас есть целевые данные как y, например:

Class1 Class2 Class3
0      0      1
1      0      0
1      0      0
0      1      0

Вы должны скомпилировать свою модель следующим образом:

model.compile(loss='categorical_crossentropy',optimizer='rmsprop')

Напротив, если у вас есть целевые данные как y, например:

labels
2
0
0
1

Вы должны скомпилировать свою модель следующим образом:

model.compile(loss='sparse_categorical_crossentropy',optimizer='rmsprop')

Результат и производительность вашей модели будут такими же, только это может повлиять на использование памяти.

person Geeocode    schedule 24.12.2019
comment
Спасибо, понятно ... для данных меток с горячим кодированием теперь это работает, но я также забыл настроить model.add(Dense(10), чтобы отразить 10 меток. Но он по-прежнему не работает для целевых данных, которые представляют собой только один выходной вектор y=[1,2,...10], чтобы отразить все документы .. Я получаю следующую ошибку (если это сделано для 5 документов y=[1,2,3,4,5] InvalidArgumentError: Received a label value of 5 which is outside the valid range of [0, 5). Label values: 5 [[{{node loss_15/dense_15_loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}]] - person Felix; 25.12.2019
comment
@Felix Если выходной плотный слой имеет 5 выходов, он будет исключать только метки в [0,1,2,3,4], поскольку индексирование Python начинается с 0. Итак, ваши ярлыки должны иметь эти значения, поэтому жалоба. Пожалуйста, не забудьте принять мой ответ с галочкой, если вас устраивает, - person Geeocode; 26.12.2019