首页 > 解决方案 > 如何在带有嵌入层的 keras 中构建序列到序列的自动编码器?

问题描述

我想在 keras 中构建一个序列到序列的自动编码器。目的是“doc2vec”。

在keras博客上的文档中,我找到了一个例子:https ://blog.keras.io/building-autoencoders-in-keras.html

from keras.layers import Input, LSTM, RepeatVector
from keras.models import Model

inputs = Input(shape=(timesteps, input_dim))
encoded = LSTM(latent_dim)(inputs)

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

sequence_autoencoder = Model(inputs, decoded)
encoder = Model(inputs, encoded)

如果我需要为此添加嵌入层怎么办?如果我们正在处理一段文本,我们假设应该首先对文本进行标记,将其嵌入到预先训练的向量中,对吗?

我是否需要解码器中的密集或时间分布密集层?我需要颠倒顺序吗?

提前致谢。

标签: pythonkerasrnnautoencoder

解决方案


正如文档所述,嵌入层只能用作模型中的第一层,因此如下所示:

inputs = Input(shape=(timesteps, input_dim))
embedded = Embedding(vocab_size, embedding_size, mask_zero=True, ...))(inputs)
encoded = LSTM(latent_dim)(embedded)

我们应该首先对文本进行标记,将其嵌入到预先训练的向量中,对吗?是的,这是默认选项。如果您有足够大的语料库,您只能训练自己的嵌入,否则通常会使用GloVe 。有一个Keras 示例使用 GloVe 和内部Tokenizer将文本传递到具有嵌入层的模型中。

对于解码,您将需要一个Dense层,但TimeDistributed在版本 2 中使用是可选的。默认情况下Dense,会将内核应用于您传递的 3D 张量的每个时间步:

decoded = RepeatVector(timesteps)(encoded)
decoded = LSTM(input_dim, return_sequences=True)(decoded)
decoded = Dense(vocab_size, activation='softmax')(decoded)
# (batch_size, timesteps, vocab_size)

值得注意的是,取前 N 个最常用的词将加快训练速度,否则softmax计算成本将变得非常高。Keras 示例还采用了有限数量的单词,并且每个其他单词都映射到一个特殊的 UNKnown 标记。


推荐阅读