我正在数据集上训练带有Keras的LSTM模型,如下所示。变量"描述"是一个文本字段和"年龄"和"性别"是分类和连续的领域。
Age, Gender, Description
22, M, "purchased a phone"
35, F, "shopping for kids"
我使用文字嵌入将文本字段转换为字向量,然后在keras模型中输入。代码如下:
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'])
此模型已成功运行,但我想输入" age"和"性别"变量也是特征。代码中还需要进行哪些更改才能使用这些功能?
答案 0 :(得分:9)
您想要添加更多输入图层,这是使用顺序模型无法实现的,您必须选择功能模型
from keras.models import Model
允许您拥有多个输入和间接连接。
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'])
你不能在LSTM层之前连接,因为它没有意义,并且在嵌入图层和输入之后你将有3D Tensor是2D Tensor。
答案 1 :(得分:1)
考虑使用单独的前馈网络来接收这些功能并输出一些n维向量。
time_independent = Input(shape=(num_features,))
dense_1 = Dense(200, activation='tanh')(time_independent)
dense_2 = Dense(300, activation='tanh')(dense_1)
首先,请使用keras' functional API做这样的事情。
然后您可以将其作为LSTM的隐藏状态传递,或者您可以将其与每个嵌入的单词连接,以便lstm在每个时间步都看到它。在后一种情况下,您可能希望大幅降低网络的维度。
如果您需要一个例子,请告诉我。
答案 2 :(得分:1)
我写了关于how to do this in keras的文章。它基本上是一个功能性的多输入模型,将两个特征向量连接起来就可以了:
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])