У меня есть набор данных с двумя столбцами. Каждый столбец содержит набор документов. Я должен сопоставить документ в столбце A с документами, представленными в столбце B. Это проблема контролируемой классификации. Таким образом, мои обучающие данные содержат столбец меток, указывающий, совпадают ли документы или нет.
Чтобы решить эту проблему, я создал набор функций, скажем, f1-f25 (путем сравнения двух документов), а затем обучил двоичный классификатор этим функциям. Этот подход работает достаточно хорошо, но теперь я хотел бы оценить модели глубокого обучения по этой проблеме (в частности, модели LSTM).
Я использую библиотеку keras
в Python. После изучения документации keras и других руководств, доступных в Интернете, мне удалось сделать следующее:
from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model
# Each document contains a series of 200 words
# The necessary text pre-processing steps have been completed to transform
each doc to a fixed length seq
main_input1 = Input(shape=(200,), dtype='int32', name='main_input1')
main_input2 = Input(shape=(200,), dtype='int32', name='main_input2')
# Next I add a word embedding layer (embed_matrix is separately created
for each word in my vocabulary by reading from a pre-trained embedding model)
x = Embedding(output_dim=300, input_dim=20000,
input_length=200, weights = [embed_matrix])(main_input1)
y = Embedding(output_dim=300, input_dim=20000,
input_length=200, weights = [embed_matrix])(main_input2)
# Next separately pass each layer thru a lstm layer to transform seq of
vectors into a single sequence
lstm_out_x1 = LSTM(32)(x)
lstm_out_x2 = LSTM(32)(y)
# concatenate the 2 layers and stack a dense layer on top
x = keras.layers.concatenate([lstm_out_x1, lstm_out_x2])
x = Dense(64, activation='relu')(x)
# generate intermediate output
auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(x)
# add auxiliary input - auxiliary inputs contains 25 features for each document pair
auxiliary_input = Input(shape=(25,), name='aux_input')
# merge aux output with aux input and stack dense layer on top
main_input = keras.layers.concatenate([auxiliary_output, auxiliary_input])
x = Dense(64, activation='relu')(main_input)
x = Dense(64, activation='relu')(x)
# finally add the main output layer
main_output = Dense(1, activation='sigmoid', name='main_output')(x)
model = Model(inputs=[main_input1, main_input2, auxiliary_input], outputs= main_output)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit([x1, x2,aux_input], y,
epochs=3, batch_size=32)
Однако, когда я оцениваю это на данных обучения, я получаю ту же проблему. оценка для всех случаев. Проблема, по-видимому, связана с тем, как подается дополнительный вход (потому что он генерирует значимый вывод, когда я удаляю дополнительный вход). Я также пробовал вставлять вспомогательный вход в разные места в сети. Но почему-то я не мог заставить это работать.
Любые указатели?