Как подать на вход RNN фичи, представленные списком векторов(эквивалентно предложению), а не одним вектором(эквивалентно слову)?
Сейчас я для каждого слова в предложении вычисляю векторное представление(word2vec), домножаю на TF-IDF и
усредняю, получается один вектор фиксированной размерности. А хочется подавать на вход не среднее, а последовательность.
# Сейчас модель такая - 2 фичи - 2 вектора размерности 300 на входе r_model = Sequential() r_model.add(LSTM(200, input_shape=(2, 300), return_sequences=True)) r_model.add(LSTM(300, return_sequences=True)) ...
Я хочу дополнять списки векторов слов нулевыми векторами до длины максимального — 105. А потом подать такую последовательность на вход:
# Хочется подавать на вход последовательность # max_len - максимальная длина списка векторов max_len = 105 r_model = Sequential() r_model.add(LSTM(200, input_shape(2, max_len, 300), return_sequences=True)) r_model.add(LSTM(300, return_sequences=True)) ...
Но keras говорит, что требуется шэйп размерностью 3, а не 4, как во втором случае:
Input 0 is incompatible with layer lstm_5: expected ndim=3, found ndim=4
Любая нейронная сеть, в том числе рекуррентная, ожидает в качестве входа объект фиксированной размерности (и в качестве выхода тоже выдает объект фиксированной размерности).
-
Чтобы подавать на вход именно последовательность и получать на выходе последовательность, можно проходить по данным (в вашем случае — тексту) скользящим окном фиксированного размера, или, если данных меньше, добивать нулями каким-либо образом до нужной размерности.
-
Еще один метод, который можно использовать — объединять векторные представления в одну структуру фиксированной длины, которая будет вести себя как фильтр Блума.
Насколько я знаю, такой прием применяется в хемоинформатике для быстрого поиска молекул с нужными свойствами и должен быть применим к быстрому поиску текстов: в случае с молекулой «словом», которое выражается с помощью вектора, будет фармакофорный фрагмент, а текстом — вся молекула (если Вам интересно понять, что это такое, и составить свое мнение о корректности этой аналогии, то про фармакофоры можно почитать, например, на geektimes).
Но в качестве входа для нейросети фильтр Блума может давать не очень хороший результат из-за ложноположительных срабатываний, и принципиально этот метод будет похож на тот, который сейчас используете Вы, при этом он не будет учитывать веса слов в тексте. Поэтому я думаю, что Вам больше подойдет использовать скользящее окно.