Python 如何在带有嵌入层的keras中构建序列到序列的自动编码器?

Python 如何在带有嵌入层的keras中构建序列到序列的自动编码器?,python,keras,rnn,autoencoder,Python,Keras,Rnn,Autoencoder,我想在keras中构建一个序列到序列的自动编码器。目的是“doc2vec” 在keras博客上的文档中,我发现了一个例子: 如果我需要添加一个嵌入层呢?如果我们处理一段文本,我们假设应该首先标记文本,用预先训练好的向量嵌入它,对吗 解码器中需要密集层还是时间分布密集层?我需要颠倒顺序吗 提前感谢。嵌入层只能用作模型中的第一层作为状态,因此如下所示: inputs = Input(shape=(timesteps, input_dim)) embedded = Embedding(vocab_si

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

在keras博客上的文档中,我发现了一个例子:

如果我需要添加一个嵌入层呢?如果我们处理一段文本,我们假设应该首先标记文本,用预先训练好的向量嵌入它,对吗

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

提前感谢。

嵌入层只能用作模型中的第一层作为状态,因此如下所示:

inputs = Input(shape=(timesteps, input_dim))
embedded = Embedding(vocab_size, embedding_size, mask_zero=True, ...))(inputs)
encoded = LSTM(latent_dim)(embedded)
我们应该首先标记文本,用预先训练好的向量嵌入文本,对吗?是的,这是默认选项。只有当您拥有足够大的语料库时,才能训练自己的嵌入,否则通常会使用。有一个使用手套和内部
标记器
将文本传递到带有嵌入层的模型中

对于解码,您将需要一个
密集
层,但在版本2中使用
时间分布
是可选的。默认情况下,
densed
将内核应用于通过的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示例也使用有限数量的单词,并且每隔一个单词映射到一个特殊的未知标记。

嵌入层应该是第一层。在我看来,它不需要预先训练。至于密集解码层:人们更喜欢具有类似编码/解码架构的自动编码器,但这不是必须的。我认为最好的方法是尝试一下,然后感受一下什么最适合你。对于autoencoder,假设x=y。如果使用嵌入层,我的输入被标记为一个热点数字,而被嵌入到模型中,然后经过两层RNN,然后与作为输入的标签(标记数字)进行比较。这个模型似乎很难训练。损失很高,准确率很低,什么都学不到。不知道我哪里弄错了
decoded = RepeatVector(timesteps)(encoded)
decoded = LSTM(input_dim, return_sequences=True)(decoded)
decoded = Dense(vocab_size, activation='softmax')(decoded)
# (batch_size, timesteps, vocab_size)