首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Keras中使用附加功能和单词嵌入?

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

Stack Overflow用户
提问于 2018-03-08 22:50:25
回答 3查看 7.8K关注 0票数 16

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

代码语言:javascript
复制
Age, Gender, Description
22, M, "purchased a phone"
35, F, "shopping for kids"

我使用单词嵌入将文本字段转换为单词向量,然后将其输入到keras模型中。代码如下:

代码语言:javascript
复制
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'])

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-08 23:37:01

您想要添加更多的输入层,这在顺序模型中是不可能的,您必须使用功能模型

代码语言:javascript
复制
from keras.models import Model

这允许您有多个输入和间接连接。

代码语言:javascript
复制
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张量,而输入是2D张量。

票数 13
EN

Stack Overflow用户

发布于 2019-07-12 00:42:26

我写过关于how to do this in keras的文章。它基本上是一个功能性的多输入模型,它将两个特征向量连接在一起,如下所示:

代码语言:javascript
复制
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])
票数 6
EN

Stack Overflow用户

发布于 2018-03-08 23:19:36

考虑有一个单独的前馈网络,它接受这些特征并输出一些n维向量。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49175961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档