Добавление дополнительного измерения в текстовую классификацию - PullRequest
0 голосов
/ 24 января 2019

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

model = Sequential()
model.add(Embedding(NUMVOCABOLARYWORDS, 5, input_length = sequenceDataPadded.shape[1]))
model.add(LSTM(256, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(128))
model.add(Dense(1))

Эта сеть принимает дополненные токенами последовательности текста. Например. Я токенизирую текст "hello world" = [0,1,0,0,0 ..]. Тренируется и хорошо оценивает.

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

1) Должен ли я сплющить вход или попытаться уменьшить размеры? Какие слои я могу использовать для этой работы?

2) Должен ли я просто создать одну большую последовательность со всем текстом?

3) Имеет ли смысл иметь LSTM с 4 размерами?

4) Существуют ли примеры для классификации с массивом массивов токенов?

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

1 Ответ

0 голосов
/ 28 января 2019

Я не думаю, что объединение всего текста - это решение. Тогда проблема заключается в том, что если вы передадите его в LSTM, то скрытые состояния каждого текста не начнутся изначально. Таким образом, вы вводите первый текст, а затем второй и все остальные тексты будут иметь текущее скрытое состояние.

Вы можете использовать функциональный API, создавать различные входные данные и назначать каждому входному свой собственный LSTM. Тогда вы можете объединить их и получить плотные слои в конце. Еще одна вещь, которую вы можете попробовать, это использовать CNN. Опять же, вам нужно либо создать несколько входов, либо объединить все входы, а затем использовать слои CNN. Преимущество здесь может быть скорость. Потому что, в зависимости от того, сколько у вас LSTM и насколько велик ваш вклад, обучение может занять довольно много времени. Тем более, что обратное распространение также должно проходить через каждый шаг. Так что в плане производительности вам, возможно, будет лучше с CNN.

Так что я бы сделал так, чтобы массивы оставались отдельно с максимальной длиной. Затем вы дополняете каждый массив до этой длины (если они должны быть короткими). Затем вы создаете несколько входов с помощью Functional API и используете слои Conv1D позади него. Вы выполняете некоторые операции конвека (может быть, сложите несколько слоев конвекса, maxpooling и т. Д.). Затем вы объединяете их со слоем сцепления . И тогда у вас есть более плотный или CNN.

...