2017-06-10 34 views
0

我是一个新的keras用户,我想要轻松理解如何构建lstm模型。如何处理LSTM模型中的一些时间序列?

在我的数据,我有很多的用户,其中有许多序列,如下:

user 1 : 
     X   Labels 
    sequence 1 [ 0, 1 , 0, 1] 
    sequence 2 [ 0, 1 , 0, 1] 
    sequence 3 [ 0, 1 , 0, 1 
    sequence 4   ? 

user 2 : 
     X    labels 
    sequence 1 [ 0, 1 , 0, 1] 
    sequence 2 [ 0, 1 , 0, 1] 
    sequence 3   ? 

每个用户都有序列系列,但不一定是相同的lenght系列。每个系列都对应一个多标签系列。 我的目标是预测每个用户下一个序列的标签,并考虑最后的序列(如时间序列)。

我成功了,当我只使用一个用户。事实上,我做了一个像 (批量大小,时间步长,特征)的输入,其中批量大小等于1,因为我有一个用户,时间步长等于序列的数量,特征等于序列长度。

model_rnn = Sequential() 
model_rnn.add(LSTM(20, return_sequences=True, input_shape=(None, 20))) 
model_rnn.add(TimeDistributedDense(nb_classes)) 
model_rnn.add(Activation("sigmoid")) 
optimizer = RMSprop(lr=0.01,decay=1e-6) 
model_rnn.compile(loss='binary_crossentropy', optimizer=optimizer) 
X_train = X_train.reshape((1,50,20)) 
y_train = y_train.reshape((1,50,109)) 
model_rnn.fit(X_train,y_train, batch_size=1, epochs=200) 

我有两个问题: 它是重要的,当我适合的模式,即洗牌=假?
当我定义LSTM时,我应该将有状态选项等于True吗?

我已经获得了一个用户的良好表现。我想对所有用户使用相同的方法。但我不明白我如何为所有用户构建输入。

例如,我想学习旧的用户序列并预测他的下一个序列, 我是否会被迫为每个用户训练一个LSTM?或者我可以在一个LSTM中倾斜每个用户的时间序列? 特别是如果我使用一个LSTM,并且我想预测下一个用户的序列,那么模型如何能够预测好句子,就好像它不知道训练数据上的这个自己的旧序列。

注意,重要的是要考虑用户之间的序列是独立的。

谢谢您的帮助

回答

0

它是重要的,当我适合的模式,即洗牌=假?

不,它不重要,除非将有状态设置为True。在下面看到你的下一个问题的答案。


我应该把等于True的状态选项时,我定义LSTM?

LSTM具有单元,因此按照定义(与Keras中使用的不同)有状态。 Fabien Chollet给出了这种有状态的定义:

stateful:Boolean(默认为False)。如果为True,则批次中索引i处的每个 样品的最后一个状态将用作下一批中索引i的 样品的初始状态。

因此,如果在Keras中将LSTM设置为无状态,则在每个序列处都会重置单元状态。使用有状态模式设置,所有状态都会传播到下一批。这意味着位于索引i处的样本X_ {i}的状态将用于计算下一批中的样本X_ {i + bs},其中bs是批量大小(无混洗)。

请注意,默认情况下,Keras混洗(置换)样本X,并且X_ {i}和X_ {i + 1}之间的依赖关系丢失。因此,如果将有状态选项设置为True,请确保设置为shuffle=False


我要学习老用户序列,并预测他的下一个序列,我将被迫接受培训,每个用户LSTM?或者我可以在一个LSTM中倾斜每个用户的时间序列?

我相信,你需要一个LSTM,因为它对一个用户来说效果很好。您可以将所有用户的所有序列视为您的训练数据,就像您为一位用户所做的那样。

相关问题