Estoy entrenando un modelo LSTM con Keras en el conjunto de datos que se parece a lo siguiente. La variable "Descripción" es un campo de texto y "Edad" y "Género" son campos categóricos y continuos.
Age, Gender, Description 22, M, "purchased a phone" 35, F, "shopping for kids"Estoy usando incrustación de palabras para convertir los campos de texto en vectores de palabras y luego ingresarlo en el modelo de keras. El código se da a continuación:
model = Sequential() model.add(Embedding(word_index, 300, weights=[embedding_matrix], input_length=70, trainable=False)) model.add(LSTM(300, dropout=0.3, recurrent_dropout=0.3)) model.add(Dropout(0.6)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics['accuracy'])Este modelo se está ejecutando correctamente, pero también quiero ingresar las variables "edad" y "género" como características. ¿Qué cambios se requieren en el código para usar estas funciones también?
Desea agregar más capas de entrada, lo que no es posible con el modelo secuencial, debe optar por un modelo funcional
from keras.models import Modello que le permite tener múltiples entradas y conexiones indirectas.
embed = Embedding(word_index, 300, weights=[embedding_matrix], input_length=70, trainable=False) lstm = LSTM(300, dropout=0.3, recurrent_dropout=0.3)(embed) agei = Input(shape=(1,)) conc = Concatenate()(lstm, agei) drop = Dropout(0.6)(conc) dens = Dense(1)(drop) acti = Activation('sigmoid')(dens) model = Model([embed, agei], acti) model.compile(loss='binary_crossentropy', optimizer='adam', metrics['accuracy'])No puede concatenar antes de la capa LSTM ya que no tiene sentido y también tendrá un tensor 3D después de incrustar la capa y la entrada es un tensor 2D.
Escribí sobre cómo hacer esto en keras . Es básicamente un modelo de entrada múltiple funcional, que concatena ambos vectores de funciones de esta manera:
nlp_input = Input(shape=(seq_length,), name='nlp_input') meta_input = Input(shape=(10,), name='meta_input') emb = Embedding(output_dim=embedding_size, input_dim=100, input_length=seq_length)(nlp_input) nlp_out = Bidirectional(LSTM(128))(emb) x = concatenate([nlp_out, meta_input]) x = Dense(classifier_neurons, activation='relu')(x) x = Dense(1, activation='sigmoid')(x) model = Model(inputs=[nlp_input , meta_input], outputs=[x])Considere tener una red de avance separada que tome esas características y genere un vector n dimensional.
time_independent = Input(shape=(num_features,)) dense_1 = Dense(200, activation='tanh')(time_independent) dense_2 = Dense(300, activation='tanh')(dense_1)En primer lugar, utilice la API funcional de Keras para hacer algo como esto.
Luego, pasaría esto como el estado oculto del LSTM, o puede concatenarlo con cada palabra incrustada para que el lstm lo vea en cada paso de tiempo. En el último caso, querrá reducir drásticamente la dimensionalidad de la red.
Si necesitas un ejemplo, házmelo saber.