如何在具有嵌入层的keras中构建Sequence-to-Sequence自动编码器?

时间:2018-08-09 23:34:53

标签: python keras rnn autoencoder

我想在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)

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

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

谢谢。

1 个答案:

答案 0 :(得分:1)

由于documentation状态,嵌入层只能用作模型的第一层,所以类似这样:

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

我们应该首先标记文本,然后将其嵌入预先训练的矢量中,对吗?是的,这是默认选项。如果您的语料库足够大,您仅训练自己的嵌入 ,否则通常使用GloVe。有一个Keras example使用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令牌。