我试图调和我对lstm的理解,并在Christopher Olah在Keras中实现的这篇文章中指出。我正在关注Jason Brownlee写的关于Keras教程的博客。我最困惑的是,
将数据序列重塑为[样本,时间步长,特征],
有状态lstm
让我们把注意力集中在上面两个问题上,参考下面粘贴的代码:
# 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数组,其中每个元素都是一个长度为N的look_back序列。
什么是时间步长和特征?
可以看到,TrainX是一个三维数组,Time_steps和Feature分别是最后两个维度(在这个特定的代码中是3和1)。对于下图,这是否意味着我们正在考虑多对一的情况,其中粉色盒子的数量是3?或者它字面上的意思是链长为3(即只考虑3个绿色盒子)。
当我们考虑多元级数时,特征参数是否相关?例如,同时对两只金融股建模?
有状态LSTMs
有状态lstm是否意味着我们在批运行之间保存单元内存值?如果是这种情况,batch_size为1,并且在训练运行之间重置内存,那么说它是有状态的有什么意义呢?我猜这与训练数据没有被打乱有关,但我不确定是怎么回事。
任何想法吗?
图片参考:http://karpathy.github.io/2015/05/21/rnn-effectiveness/
编辑1:
@van关于红色和绿色盒子相等的评论有点困惑。为了确认,下面的API调用是否与展开的图表相对应?特别注意第二个图(batch_size是任意选择的):
编辑2:
如果你已经上过Udacity的深度学习课程,但仍然对time_step参数感到困惑,请查看下面的讨论:https://discussions.udacity.com/t/rnn-lstm-use-implementation/163169
更新:
原来model.add(timedidistributeddense (vocab_len))就是我要找的。这里有一个例子:https://github.com/sachinruk/ShakespeareBot
更新2:
我在这里总结了我对lstm的大部分理解:https://www.youtube.com/watch?v=ywinX5wgdEU