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

标签 python keras recurrent-neural-network 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)

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

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

提前致谢。

最佳答案

嵌入层只能用作模型中的第一层作为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层,但使用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 示例也采用有限数量的单词,每个其他单词都映射到一个特殊的未知标记。

关于python - 如何在带有嵌入层的keras中构建序列到序列自动编码器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51777072/

相关文章:

python - Pandas 有效地搜索匹配条件的第一行

keras - 为什么 Keras 为单个 .fit 运行编写多个张量板日志?

python - Keras:TensorFlow 1.3 模型在 TensorFlow 1.4 或更高版本下失败(错误预测)

python - 简单的递归神经网络输入形状

python - Keras LSTM 较大的功能压倒较小的功能?

python - 打印出输入的最大和最小数

python - 我如何将分层列表排序为字典的树/金字塔模型?

neural-network - 我如何实际执行保存的 TensorFlow 模型?

python - 是否有构建和组织 Django 模型的 'good' 方法?

python - keras 加载模型错误尝试将包含 17 层的权重文件加载到具有 0 层的模型中