我试图调和我对LSTM的理解,并在克里斯托弗·奥拉(Christopher Olah)在Keras中实现的这篇文章中指出了这一点。我正在关注Jason Brownlee为Keras教程撰写的博客。我最困惑的是
将数据系列重塑为[samples, time steps, features]和有状态的LSTM让我们参考下面粘贴的代码专注于以上两个问题:
look_back = 3trainX, trainY = create_dataset(train, look_back)testX, testY = create_dataset(test, look_back)
trainX = numpy.reshape(trainX, (trainX.shape[0], look_back, 1))testX = numpy.reshape(testX, (testX.shape[0], look_back, 1))
########################
##########################
batch_size = 1model = 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是一个3-D数组,其中Time_steps和Feature是最后两个维度(在此特定代码中为3和1)。对于下图,这是否意味着我们正在考虑many to one粉红色盒数为3的情况?还是字面上的意思是链长为3(即仅考虑了3个绿色框)。在此处输入图片说明
当我们考虑多元序列时,features参数是否有意义?例如同时模拟两个金融股票?
有状态的LSTM有状态的LSTM是否意味着我们在批次运行之间保存单元内存值?如果是这种情况,batch_size则为1,并且在两次训练之间将内存重置,那么说这是有状态的是什么意思。我猜想这与训练数据没有被改组这一事实有关,但是我不确定如何。
有什么想法吗?图片参考:http : //karpathy.github.io/2015/05/21/rnn-efficiency/
编辑1:@van对红色和绿色方框相等的评论有点困惑。因此,为了确认一下,以下API调用是否与展开的图相对应?特别注意第二张图(batch_size被任意选择): 在此处输入图片说明 在此处输入图片说明
编辑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
更新2:我在这里总结了我对LSTM的大部分理解:https : //www.youtube.com/watch?v= ywinX5wgdEU