带有嵌入层的 Keras LSTM 自动编码器

Posted

技术标签:

【中文标题】带有嵌入层的 Keras LSTM 自动编码器【英文标题】:Keras LSTM autoencoder with embedding layer 【发布时间】:2017-11-27 14:26:49 【问题描述】:

我正在尝试在 Keras 中构建文本 LSTM 自动编码器。我想使用嵌入层,但我不确定如何实现它。代码如下所示。

inputs = Input(shape=(timesteps, input_dim))
embedding_layer = Embedding(numfeats + 1,
                            EMBEDDING_DIM,
                            weights=[data_gen.get_embedding_matrix()],
                            input_length=maxlen,
                            trainable=False)

embedded_sequence = embedding_layer(inputs)
encoded = LSTM(num_units)(inputs)

decoded = RepeatVector(timesteps)(encoded)
decoded = LSTM(???, return_sequences=True)(decoded)

sequence_autoencoder = Model(inputs, decoded)

sequence_autoencoder.compile(loss='binary_crossentropy', optimizer='adam')

我不确定如何将输出解码为目标序列(显然是输入序列)。

【问题讨论】:

你知道怎么做吗? 【参考方案1】:

没有办法在解码器中实现反嵌入层,因为嵌入层是不可微的。可能还有其他解决方法:

    将自编码器从嵌入层的输出构造到具有相似维度的层。然后使用最近邻或其他算法从那里生成单词序列。

    构造一个非对称自编码器,使用时间分布层和密集层来降低LSTM输出的维度。

希望这会有所帮助。

【讨论】:

你能举个例子吗? 第一个解决方案可以在不需要映射到单词标记的情况下工作。预期输出是输入序列的嵌入,输出层是形状为 (n_words, embedding_dim) 的密集层。唯一的问题是很难优化这个目标。【参考方案2】:

您可以先将单词转换为嵌入,然后将它们传递给 fit()

expected_output = np.array([[embedding_matrix[word_index] for word_index in encoded_sequence] for encoded_sequence in padded_sequences])
history = lstm_autoencoder.fit(padded_sequences, expected_output, epochs=15, verbose=1)

【讨论】:

我的理解是这是@ChrisYao建议的第一个解决方案的一个例子。预期输出是输入序列的嵌入,输出层是形状为 (n_words, embedding_dim) 的密集层。唯一的问题是优化这个目标可能很困难。

以上是关于带有嵌入层的 Keras LSTM 自动编码器的主要内容,如果未能解决你的问题,请参考以下文章

用于时间序列异常检测的 Keras LSTM-VAE(变分自动编码器)

如何在 Keras 的两个 LSTM 层之间添加注意力层

有没有办法从 Keras 的自动编码器中获取任何层的特征? [复制]

带有用于可变长度输入的掩蔽层的 Keras lstm

用于可变长度序列的 LSTM 变分自动编码器

在 Keras 中为 LSTM 重塑批次