【发布时间】:2017-11-22 15:43:44
【问题描述】:
我正在尝试构建一个 LSTM 自动编码器,目标是从序列中获取固定大小的向量,该向量尽可能好地表示序列。这个自动编码器由两部分组成:
-
LSTM编码器:获取一个序列并返回一个输出向量 (return_sequences = False) -
LSTM解码器:获取一个输出向量并返回一个序列(return_sequences = True)
所以,最后,编码器是多对一 LSTM,解码器是一对多 LSTM。
图片来源: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]],
... ]
问题:我不知道如何进行,尤其是如何将LSTM 集成到Model 以及如何让解码器从向量生成序列。
我正在使用keras 和tensorflow 后端。
编辑:如果有人想尝试,这是我生成带有移动序列的随机序列(包括填充)的过程:
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.
)
【问题讨论】:
-
你为什么要生成随机序列?
-
@lelloman:仅用于测试目的。我希望测试这个就足够了。我认为它无论如何都应该起作用,因为这项任务是关于重建而不是真正寻找模式。
-
我只是出于好奇而问,我真的不是专家。但是自动编码器不应该需要模式才能工作吗?
-
@lelloman:我认为你最终是对的。但我也猜想,如果问题不是太大并且您的输出向量具有足够高的维度,您可以编码随机序列而不会丢失大量信息。但这可能是我错了。希望我们能看到情况如何。而我的真实数据当然不是随机的。
-
您可以从这里使用
one-to-many方法:*.com/questions/43034960/…
标签: python machine-learning tensorflow deep-learning keras