当前位置: 首页>>技术问答>>正文


了解Keras LSTM

我试图通过这篇文章http://colah.github.io/posts/2015-08-Understanding-LSTMs/加强对LSTMs的理解,并使用Keras实现了LSTM。同时也关注了为Keras教程编写的http://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/博客。我主要困惑的是,

  1. 将数据系列(data series)重新组织(reshape)到[samples, time steps, features]中,

  2. 有状态的LSTMs

让我们把注意力集中在以上两个问题上,参考下面的代码:

# reshape into X=t and Y=t+1
look_back = 3
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)

# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], look_back, 1))
testX = numpy.reshape(testX, (testX.shape[0], look_back, 1))
########################
# The IMPORTANT BIT
##########################
# create and fit the LSTM network
batch_size = 1
model = Sequential()
model.add(LSTM(4, batch_input_shape=(batch_size, look_back, 1), stateful=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
for i in range(100):
    model.fit(trainX, trainY, nb_epoch=1, batch_size=batch_size, verbose=2, shuffle=False)
    model.reset_states()

注意:create_dataset采用长度为N的序列,并返回一个N-look_back数组,其中每个元素都是look_back长度序列。

什么是时间步骤和特征?

可以看出TrainX是Time_steps的三维数组,特征分别是最后两个维(在这个特定的代码中是3和1)。关于下面的图片,这是否意味着我们正在考虑many to one情形,其中粉红色框的数量是3?或者它是否意味着链长是3(即只考虑3个绿色框)。

python,deep-learning,keras,lstm

当我们考虑多元系列时,特征参数是否变得相关?例如同时建模两个金融股?

有状态的LSTM

有状态的LSTM是否意味着我们在批次间保存单元内存值?如果是这样的话,batch_size就是一个,而且训练运行之间的 memory 是重置的,所以说这是有状态的。我猜这是与训练数据不做洗牌(shuffle)有关,但是不太确定。

有什么想法吗?图片参考:http://karpathy.github.io/2015/05/21/rnn-effectiveness/

编辑1:

下面的API调用是否与展开图相对应?特别注意第二张图(batch_size是任意选择的):

python,deep-learning,keras,lstm

python,deep-learning,keras,lstm

编辑2:

对于那些已经完成Udacity的深度学习课程,仍然对time_step参数感到困惑的人,请看下面的讨论:https://discussions.udacity.com/t/rnn-lstm-use-implementation/163169

更新:

原来model.add(TimeDistributed(Dense(vocab_len)))是我正在寻找的。这里是一个例子:https://github.com/sachinruk/ShakespeareBot

UPDATE2:

我在这里总结了我对LSTM的大部分理解:https://www.youtube.com/watch?v=ywinX5wgdEU

最佳解决办法

首先,你选择了很好的教程(12)来启动。

Time-step表示:X.shape(描述数据形状)中的Time-steps==3表示有三个粉红色的框。由于在Keras每一步都需要输入,所以绿色框的数量通常应该等于红色框的数量。除非你破解这个结构。

多对多与多对一:在keras中,在初始化LSTMGRUSimpleRNN时有一个return_sequences参数。当return_sequencesFalse时(默认),则如图所示为多对一。它的返回形状是(batch_size, hidden_unit_length),它代表最后一个状态。当return_sequencesTrue时,则是多对多。它的形状是(batch_size, time_step, hidden_unit_length)

特征参数是否变得相关:特征参数意味着“您的红色框有多大”或每个步骤的输入维度是什么。如果您想预测8种市场信息,那么您可以使用feature==8生成您的数据。

有状态:您可以查看the source code。当初始化状态时,如果stateful==True,那么上次训练的状态将被用作初始状态,否则会产生一个新的状态。我还完全理解stateful,但是,我不同意batch_size只能在stateful==True时为1。

目前,您使用收集的数据生成数据。假设您的股票信息即将到来,而不是等待一整天收集整个序列,你需要在线产生输入数据,同时训练/预测。如果您有400个股票共享一个网络,那么您可以设置batch_size==400

参考文献

本文由《纯净天空》出品。文章地址: https://vimsky.com/article/3712.html,未经允许,请勿转载。