如何在带有嵌入层的 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)

如果我需要为此添加嵌入层怎么办?如果我们处理一段文本,我们假设应该首先标记文本,用预先训练的向量嵌入它,对吧?

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

提前谢谢。

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

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层,但在版本 2 中,使用TimeDistributed是可选的。默认情况下,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 令牌。

相关内容

  • 没有找到相关文章

最新更新