J'ai un jeu de données avec 2 colonnes - Chaque colonne contient un ensemble de documents. Je dois faire correspondre le document de la colonne A avec les documents fournis dans la colonne B. Il s'agit d'un problème de classification supervisé. Ainsi, mes données d'apprentissage contiennent une colonne d'étiquette indiquant si les documents correspondent ou non.Modèle LSTM en Keras avec entrées auxiliaires
Pour résoudre le problème, j'ai créé un ensemble de fonctionnalités, disons f1-f25 (en comparant les 2 documents) et ensuite formé un classificateur binaire sur ces fonctionnalités. Cette approche fonctionne raisonnablement bien, mais maintenant je voudrais évaluer les modèles Deep Learning sur ce problème (en particulier, les modèles LSTM). J'utilise la bibliothèque keras
en Python. Après avoir traversé la documentation keras et d'autres tutoriels disponibles en ligne, je suis parvenu à faire ce qui suit:
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)
Cependant, quand je marque cela sur les données de formation, je reçois le même prob. marquer pour tous les cas. Le problème semble provenir de la manière dont l'entrée auxiliaire est introduite (car elle génère une sortie significative lorsque je supprime l'entrée auxiliaire). J'ai également essayé d'insérer l'entrée auxiliaire à différents endroits du réseau. Mais d'une manière ou d'une autre, je ne pouvais pas le faire fonctionner.
Des pointeurs?
Vous ne savez pas si cela est prévu, mais le paramètre auxiliary_output est seulement (1,). Est-ce vraiment ce que vous attendez? Fusionner 25 entrées auxiliaires avec un seul résultat? - Le modèle avant la sortie auxiliaire est-il conçu pour être «non formable» alors que vous ne formez que la partie finale? –
Eh bien oui.C'est un modèle de classification binaire donc la sortie finale est (1,). La sortie auxiliaire doit-elle être différente? Je suis simplement en train de nourrir dans l'ensemble additionnel de 25 caractéristiques comme l'entrée auxiliaire et par conséquent la forme (25,) – Dataminer
Avez-vous essayé plus d'époques? –