python - 如何在带有嵌入层的 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
层,但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 示例还采用了有限数量的单词,并且每个其他单词都映射到一个特殊的 UNKnown 标记。
推荐阅读
- microsoft-teams - Microsoft Teams 是否有用于查看用户是否已登录的 API?
- python - Manim 的问题。'转换为 dvi 时出错。'
- python - 这个CNN怎么会有奇数个参数?
- r - How to extract "distance" of the unmatched cases in matchit package?
- python - 如何获取要上传的背景图片?
- javascript - 使用函数调用动态填充对象值
- azure - 自动关闭 Azure 安全中心警报
- android - Android 获取屏幕可用大小 api 28
- java - 在替换字符串中用正则表达式替换所有字符串?
- android - Android Studio 3.5 我的按钮怎么了?