gpt4 book ai didi

python - LSTM Autoencoder 的这些实现之间的区别?

转载 作者:行者123 更新时间:2023-12-03 18:59:32 25 4
gpt4 key购买 nike

引发这个问题的具体原因是 return_sequence TensorFlow 版本的 LSTM 层的参数。
文档说:

Boolean. Whether to return the last output. in the output sequence,or the full sequence. Default: False.


我见过一些实现,尤其是自动编码器,它们使用此参数将输出序列中除最后一个元素以外的所有内容作为自动编码器的“编码器”部分的输出。
以下是 不同的实现。我想了解差异背后的原因,因为这些差异看起来非常大,但都称自己为同一件事。
示例 1(TensorFlow):
此实现去除 LSTM 的所有输出,除了序列的最后一个元素,然后重复该元素若干次以重建序列:
model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(n_in,1)))
# Decoder below
model.add(RepeatVector(n_out))
model.add(LSTM(100, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(1)))
在查看 PyTorch 中自动编码器的实现时,我没有看到作者这样做。相反,他们将 LSTM 的整个输出用于编码器(有时后跟一个密集层,有时没有)。
示例 1(PyTorch):
这个实现在应用 LSTM 层之前训练嵌入......它似乎几乎打败了基于 LSTM 的自动编码器的想法......序列在到达 LSTM 层时已经被编码。
class EncoderLSTM(nn.Module):
def __init__(self, input_size, hidden_size, n_layers=1, drop_prob=0):
super(EncoderLSTM, self).__init__()
self.hidden_size = hidden_size
self.n_layers = n_layers

self.embedding = nn.Embedding(input_size, hidden_size)
self.lstm = nn.LSTM(hidden_size, hidden_size, n_layers, dropout=drop_prob, batch_first=True)

def forward(self, inputs, hidden):
# Embed input words
embedded = self.embedding(inputs)
# Pass the embedded word vectors into LSTM and return all outputs
output, hidden = self.lstm(embedded, hidden)
return output, hidden
示例 2(PyTorch):
本示例编码器第一 展开 输入具有一个 LSTM 层,然后通过具有较少数量隐藏节点的第二个 LSTM 层进行压缩。除了扩展之外,这似乎与我发现的这篇论文一致: https://arxiv.org/pdf/1607.00148.pdf
然而,在这个实现的解码器中,没有最终的密集层。解码通过第二个 lstm 层进行,该层将编码扩展回与原始输入相同的维度。 See it here .这与论文不符(虽然不知道论文是否权威)。
class Encoder(nn.Module):
def __init__(self, seq_len, n_features, embedding_dim=64):
super(Encoder, self).__init__()
self.seq_len, self.n_features = seq_len, n_features
self.embedding_dim, self.hidden_dim = embedding_dim, 2 * embedding_dim
self.rnn1 = nn.LSTM(
input_size=n_features,
hidden_size=self.hidden_dim,
num_layers=1,
batch_first=True
)
self.rnn2 = nn.LSTM(
input_size=self.hidden_dim,
hidden_size=embedding_dim,
num_layers=1,
batch_first=True
)
def forward(self, x):
x = x.reshape((1, self.seq_len, self.n_features))
x, (_, _) = self.rnn1(x)
x, (hidden_n, _) = self.rnn2(x)
return hidden_n.reshape((self.n_features, self.embedding_dim))
题:
我想知道实现中的这种差异。差异似乎相当大。所有这些有效的方法都可以完成同样的事情吗?或者其中一些是对“真正的”LSTM 自动编码器的误导性尝试?

最佳答案

没有官方或正确的方法来设计基于 LSTM 的自动编码器的架构......名称提供的唯一细节是模型应该是自动编码器并且它应该在某处使用 LSTM 层。
您发现的每个实现都是不同且独特的,即使它们可以用于相同的任务。
让我们来描述它们:

  • TF 实现 :
  • 它假设输入只有一个 channel ,这意味着序列中的每个元素只是一个数字,并且已经过预处理。
  • LSTM layer 的默认行为在 Keras/TF 是仅输出 LSTM 的最后一个输出,您可以将其设置为使用 return_sequences 输出所有输出步骤范围。
  • 在这种情况下,输入数据已缩小到 (batch_size, LSTM_units)
  • 考虑到 LSTM 的最后一个输出当然是先前输出的函数(特别是如果它是有状态的 LSTM)
  • 它适用于 Dense(1)在最后一层以获得与输入相同的形状。

  • PyTorch 1 :
  • 他们在输入被馈送到 LSTM 之前将嵌入应用于输入。
  • 这是标准做法,它有助于例如将每个输入元素转换为向量形式(参见 word2vec 例如,在文本序列中,不是向量的每个单词都映射到向量空间) .它只是一个预处理步骤,使数据具有更有意义的形式。
  • 这并没有违背 LSTM 自动编码器的想法,因为嵌入是独立应用于输入序列的每个元素,所以当它进入 LSTM 层时不会被编码。

  • PyTorch 2 :
  • 在这种情况下,输入形状不是 (seq_len, 1)就像在第一个 TF 示例中一样,因此解码器不需要密集之后。作者在 LSTM 层中使用了与输入形状相等的单元数。


  • 最后,您根据要训练的数据来选择模型的架构,特别是:性质(文本、音频、图像)、输入形状、您拥有的数据量等等......

    关于python - LSTM Autoencoder 的这些实现之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65188556/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com