gpt4 book ai didi

python - LSTM 自动编码器

转载 作者:IT老高 更新时间:2023-10-28 22:04:49 24 4
gpt4 key购买 nike

我正在尝试构建一个 LSTM 自动编码器,目标是从序列中获取固定大小的向量,该向量尽可能好地表示该序列。这个自动编码器由两部分组成:

  • LSTM编码器:接受一个序列并返回一个输出向量(return_sequences = False)
  • LSTM解码器:获取一个输出向量并返回一个序列(return_sequences = True)

所以,最后,编码器是多对一 LSTM,解码器是一对多 LSTM。

enter image description here图片来源:Andrej Karpathy

在高层次上,编码看起来像这样(类似于 here 的描述):

encoder = Model(...)
decoder = Model(...)

autoencoder = Model(encoder.inputs, decoder(encoder(encoder.inputs)))

autoencoder.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])

autoencoder.fit(data, data,
batch_size=100,
epochs=1500)

data 的形状(训练示例数、序列长度、输入维度)数组是 (1200, 10, 5)看起来像这样:

array([[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
...,
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
... ]

问题:我不知道如何进行,尤其是如何集成LSTMModel以及如何让解码器从向量生成序列。

我正在使用 kerastensorflow后端。

编辑:如果有人想尝试,这是我生成带有移动序列(包括填充)的随机序列的过程:

import random
import math

def getNotSoRandomList(x):
rlen = 8
rlist = [0 for x in range(rlen)]
if x <= 7:
rlist[x] = 1
return rlist


sequence = [[getNotSoRandomList(x) for x in range(round(random.uniform(0, 10)))] for y in range(5000)]

### Padding afterwards

from keras.preprocessing import sequence as seq

data = seq.pad_sequences(
sequences = sequence,
padding='post',
maxlen=None,
truncating='post',
value=0.
)

最佳答案

模型可以是您想要的任何方式。如果我没听错的话,你只是想知道如何用 LSTM 创建模型?

使用 LSTM

首先,您必须定义编码向量的外观。假设您希望它是一个包含 20 个元素的数组,一个一维向量。所以,形状(无,20)。它的大小取决于你,没有明确的规则可以知道理想的大小。

并且您的输入必须是三维的,例如您的 (1200,10,5)。在 keras 摘要和错误消息中,它将显示为 (None,10,5),因为“None”表示批量大小,每次训练/预测时都会有所不同。

有很多方法可以做到这一点,但是,假设您只需要一个 LSTM 层:

from keras.layers import *
from keras.models import Model

inpE = Input((10,5)) #here, you don't define the batch size
outE = LSTM(units = 20, return_sequences=False, ...optional parameters...)(inpE)

这对于一个非常简单的编码器来说已经足够了,它会产生一个包含 20 个元素的数组(但如果需要,您可以堆叠更多层)。让我们创建模型:

encoder = Model(inpE,outE)   

现在,对于解码器,它变得晦涩难懂。你不再有一个实际的序列,而是一个静态的有意义的向量。您可能仍然想使用 LTSM,他们会假设向量是一个序列。

但在这里,由于输入具有形状 (None,20),因此您必须先将其重新整形为某个 3 维数组,以便接下来附加一个 LSTM 层。

reshape 它的方式完全取决于您。 1 个元素的 20 个步骤? 20 个元素的 1 步? 2个元素的10个步骤?谁知道?

inpD = Input((20,))   
outD = Reshape((10,2))(inpD) #supposing 10 steps of 2 elements

请务必注意,如果您不再有 10 个步骤,您将无法仅启用“return_sequences”并获得所需的输出。你将不得不工作一点。实际上,没有必要使用“return_sequences”甚至使用 LSTM,但您可以这样做。

由于在我的 reshape 中我有 10 个时间步(有意),因此可以使用“return_sequences”,因为结果将有 10 个时间步(作为初始输入)

outD1 = LSTM(5,return_sequences=True,...optional parameters...)(outD)    
#5 cells because we want a (None,10,5) vector.

您可以通过许多其他方式工作,例如简单地创建一个 50 单元的 LSTM,而不返回序列,然后重新调整结果:

alternativeOut = LSTM(50,return_sequences=False,...)(outD)    
alternativeOut = Reshape((10,5))(alternativeOut)

我们的模型是这样的:

decoder = Model(inpD,outD1)  
alternativeDecoder = Model(inpD,alternativeOut)

之后,您将模型与代码结合起来并训练自动编码器。所有三个模型将具有相同的权重,因此您可以通过使用其 predict 方法使编码器带来结果。

encoderPredictions = encoder.predict(data)

我经常看到用于生成序列的 LSTM 类似于预测下一个元素。

您只取序列中的几个元素并尝试找到下一个元素。然后你又向前迈了一步,依此类推。这可能有助于生成序列。

关于python - LSTM 自动编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44647258/

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