Keras:嵌入 LSTM

jin*_*imo 6 embedding lstm keras

在 LSTM 上用于对 IMDB 序列数据建模的 keras 示例中(https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py),在输入到 LSTM 层之前有一个嵌入层:

model.add(Embedding(max_features,128)) #max_features=20000
model.add(LSTM(128))
Run Code Online (Sandbox Code Playgroud)

嵌入层的真正作用是什么?在这种情况下,这是否意味着进入 LSTM 层的输入序列的长度是 128?如果是这样,我可以将 LSTM 层写为:

model.add(LSTM(128,input_shape=(128,1))
Run Code Online (Sandbox Code Playgroud)

但也注意到输入X_train已经过pad_sequences处理:

print('Pad sequences (samples x time)')
X_train = sequence.pad_sequences(X_train, maxlen=maxlen) #maxlen=80
X_test = sequence.pad_sequences(X_test, maxlen=maxlen) #maxlen=80
Run Code Online (Sandbox Code Playgroud)

好像输入序列长度是80?

Tho*_*lut 4

引用文档

将正整数(索引)转换为固定大小的密集向量。例如。[[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]

基本上,这会将索引(表示您的 IMDB 评论包含哪些单词)转换为具有给定大小的向量(在您的情况下为 128)。

如果您不知道嵌入是什么,请参阅维基百科的定义

词嵌入是自然语言处理(NLP)中一组语言建模和特征学习技术的统称,其中词汇表中的单词或短语被映射到相对于词汇表大小的低维空间中的实数向量(“连续空间”)。

回到你问的另一个问题:

在这种情况下,这是否意味着 LSTM 层的输入序列的长度是 128?

不完全的。对于循环网络,您将有一个时间维度和一个特征维度。128 是你的特征维度,即每个嵌入向量应该有多少个维度。您的示例中的时间维度是存储在 中的内容maxlen,用于生成训练序列。

无论您向LSTM 层提供的 128 是什么,都是 LSTM 输出单元的实际数量