如何在Keras中使用附加功能和单词嵌入?

use*_*xxx 8 python machine-learning lstm keras tensorflow

我正在数据集上训练一个带Keras的LSTM模型,如下所示.变量"Description"是文本字段,"Age"和"Gender"是分类和连续字段.

Age, Gender, Description
22, M, "purchased a phone"
35, F, "shopping for kids"
Run Code Online (Sandbox Code Playgroud)

我正在使用文字嵌入将文本字段转换为单词向量,然后在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'])
Run Code Online (Sandbox Code Playgroud)

这个模型运行成功,但我想输入"年龄"和"性别"变量作为功能.代码中还需要进行哪些更改才能使用这些功能?

Sub*_*ran 12

您想要添加更多输入图层,这是使用顺序模型无法实现的,您必须选择功能模型

from keras.models import Model
Run Code Online (Sandbox Code Playgroud)

它允许您有多个输入和间接连接.

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'])
Run Code Online (Sandbox Code Playgroud)

你不能在LSTM层之前连接,因为它没有意义,并且在嵌入图层和输入之后你将拥有3D Tensor是2D Tensor.


ixe*_*ion 5

我写过如何在 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])
Run Code Online (Sandbox Code Playgroud)