我想在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 令牌。