Как использовать мои собственные вложения предложений в Keras?

Я новичок в Keras, и я создал свои собственные вложения предложений tf_idf с формой (no_sentences, embedding_dim). Я пытаюсь добавить эту матрицу в качестве входных данных для слоя LSTM. Моя сеть выглядит примерно так:

q1_tfidf = Input(name='q1_tfidf', shape=(max_sent, 300))
q2_tfidf = Input(name='q2_tfidf', shape=(max_sent, 300))

q1_tfidf = LSTM(100)(q1_tfidf)
q2_tfidf = LSTM(100)(q2_tfidf)
distance2 = Lambda(preprocessing.exponent_neg_manhattan_distance, output_shape=preprocessing.get_shape)(
        [q1_tfidf, q2_tfidf])

Я борюсь с формой матрицы. Я получаю эту ошибку:

ValueError: Error when checking input: expected q1_tfidf to have 3 dimensions, but got array with shape (384348, 300)

Я уже проверял это сообщение: Встраивание предложений в Keras, но до сих пор не могу понять. Кажется, я упускаю что-то очевидное.

есть идеи как это сделать?


person andra    schedule 08.10.2018    source источник
comment
Чего именно вы хотите достичь? Как выглядят ваши данные?   -  person ixeption    schedule 08.10.2018
comment
Мои данные выглядят так: (вопрос1, вопрос2, метка), где метка показывает, являются ли вопросы перефразированием или нет. Моя идея состояла в том, чтобы создать вложения предложений для q1 и q2, вычислить метрику сходства между двумя кодировками и использовать эту функцию в моей нейронной сети, чтобы предсказать, дублируется ли пара или нет.   -  person andra    schedule 08.10.2018


Ответы (1)


Хорошо, насколько я понял, вы хотите предсказать разницу между двумя предложениями. Как насчет повторного использования уровня LSTM (языковая модель должна быть такой же) и просто выучить встраивание одного предложения и использовать его дважды:

q1_tfidf = Input(name='q1_tfidf', shape=(max_sent, 300))
q2_tfidf = Input(name='q2_tfidf', shape=(max_sent, 300))

lstm = LSTM(100)

lstm_out_q1= lstm (q1_tfidf)
lstm_out_q2= lstm (q2_tfidf)
predict = concatenate([lstm_out_q1, lstm_out_q2])
model = Model(inputs=[q1_tfidf ,q1_tfidf ], outputs=predict)

predict = concatenate([q1_tfidf , q2_tfidf])

Вы также можете ввести свое собственное расстояние в дополнительном слое лямбда, но, следовательно, вам нужно использовать другое изменение формы в конкатенации.

person ixeption    schedule 08.10.2018
comment
Спасибо! Я также понял, что неправильно формулирую свой ввод. Должно получиться так: q1_tfidf = Input(name='q1_tfidf', shape=(1, 300,)) q2_tfidf = Input(name='q2_tfidf', shape=(1, 300,)) - person andra; 08.10.2018