我是一名新的keras用户,我想轻松了解如何构建一个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 ?
每个用户都有序列系列,但必然是相同的长度系列。每个系列对应一个多标签系列。 我的目标是预测每个用户下一个序列的标签,同时考虑最后的序列(作为时间序列)。
当我只使用一个用户时,我成功了。的确,我做了一个像lstm一样的输入 (批量大小,时间步长,特征)批量大小等于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)
我有两个问题: 当我适应模型时,重要的是,shuffle = False? 当我定义LSTM时,我应该将有状态选项等于True吗?
我已经为一个用户获得了很好的表现。我想对所有用户使用相同的方法。但我不知道如何为所有用户构建输入。
例如,我想学习旧的用户序列并预测他的下一个序列, 我是否会被迫为每个用户训练LSTM?或者我可以在一个LSTM中倾斜每个用户的时间序列系列? 特别是如果我使用一个LSTM并且我想预测一个用户的下一个序列,那么该模型如何能够预测好的句子,就像它不知道训练数据上的这个自己的旧序列一样。
请注意,重要的是要考虑序列用户在它们之间是独立的。
感谢您的帮助
答案 0 :(得分:1)
重要的是,当我适应模型时,shuffle = False?
不,除非您将有状态设置为True,否则它并不重要。请参阅下面的问题答案。
在定义LSTM时,我应该将有状态选项等于True吗?
LSTM具有单元格,因此根据定义是有状态的(与Keras中使用的有状态意义不同)。 Fabien Chollet给出了有状态的定义:
stateful:Boolean(默认为False)。如果为True,则为每个的最后一个状态 批次中索引i处的样本将用作初始状态 下一批中索引i的样本。
因此,如果在Keras中将LSTM设置为无状态,则会在每个序列中重置单元状态。设置了有状态模式后,所有状态都将传播到下一批。这意味着位于索引i,X_ {i}的样本状态将用于计算下一批中的样本X_ {i + bs},其中 bs 是批量大小(没有改组)。
请注意,默认情况下,Keras会对样本X进行shuffles(置换),并且X_ {i}和X_ {i + 1}之间的依赖关系将丢失。因此,如果您将有状态选项设置为True ,请务必设置shuffle=False
。
我想学习旧的用户序列并预测他的下一个序列,我是否会被迫为每个用户训练一个LSTM?或者我可以在一个LSTM中倾斜每个用户的时间序列系列?
我相信,你需要一个LSTM,因为它适用于一个用户。您可以将所有用户的所有序列视为您为一个用户执行的培训数据。