带嵌入层的Keras LSTM自动编码器

带嵌入层的Keras LSTM自动编码器,keras,lstm,autoencoder,Keras,Lstm,Autoencoder,我正在尝试在Keras中构建文本LSTM自动编码器。我想使用嵌入层,但我不知道如何实现这一点。代码如下所示 inputs = Input(shape=(timesteps, input_dim)) embedding_layer = Embedding(numfeats + 1, EMBEDDING_DIM, weights=[data_gen.get_embedding_matrix

我正在尝试在Keras中构建文本LSTM自动编码器。我想使用嵌入层,但我不知道如何实现这一点。代码如下所示

inputs = Input(shape=(timesteps, input_dim))
embedding_layer = Embedding(numfeats + 1,
                            EMBEDDING_DIM,
                            weights=[data_gen.get_embedding_matrix()],
                            input_length=maxlen,
                            trainable=False)

embedded_sequence = embedding_layer(inputs)
encoded = LSTM(num_units)(inputs)

decoded = RepeatVector(timesteps)(encoded)
decoded = LSTM(???, return_sequences=True)(decoded)

sequence_autoencoder = Model(inputs, decoded)

sequence_autoencoder.compile(loss='binary_crossentropy', optimizer='adam')

我不知道如何将输出解码成目标序列(显然是输入序列)。

因为嵌入层是不可微的,所以无法在解码器中实现反向嵌入层。可能还有其他解决方法:

  • 从嵌入层的输出构造自动编码器,到具有相似尺寸的层。然后使用最近邻或其他算法从那里生成单词序列

  • 构造一个非对称自动编码器,使用时间分布层和密集层来降低LSTM输出的维数


  • 希望这会有所帮助。

    您可以首先将单词转换为嵌入并将其传递给fit()


    你知道如何做到这一点吗?你能参考一个例子吗?第一个解决方案不需要映射到单词标记中就可以工作。预期输出是输入序列的嵌入,输出层是具有形状的密集层(n_单词,嵌入_dim)。唯一的问题是很难优化这个目标。我的理解是,这是@ChrisYao提出的第一个解决方案的一个例子。预期输出是输入序列的嵌入,输出层是具有形状的密集层(n_单词,嵌入_dim)。唯一的问题是很难优化这一目标。
    expected_output = np.array([[embedding_matrix[word_index] for word_index in encoded_sequence] for encoded_sequence in padded_sequences])
    history = lstm_autoencoder.fit(padded_sequences, expected_output, epochs=15, verbose=1)