我想知道LSTM在Keras中如何工作。例如,在this tutorial中,您可以找到许多类似的内容:
model.add(LSTM(4, input_shape=(1, look_back)))
“ 4”是什么意思。是该层中神经元的数量。对于神经元,我的意思是对于每个实例给出单个输出的东西?
实际上,我找到了this brillant discussion,但对the reference given中提到的解释并不确定。
在该方案中,可以看到图示的num_units
,我认为说每个单元都是一个非常原子的LSTM单元(即4个门)是没有错的。但是,这些单元如何连接?如果我是对的(但不确定),则x_(t-1)
的大小为nb_features
,因此每个要素将是一个单位的输入,并且num_unit
必须等于nb_features
?
现在,让我们谈谈keras。我已阅读this post and the accepted answer并遇到麻烦。确实,答案是:
基本上,形状类似于(batch_size,timepan,input_dim),其中input_dim
可以与unit
在哪种情况下?我对以前的参考书感到困惑...
此外,它说,
Keras中的LSTM仅定义一个LSTM块,其单元长度为单位长度。。
好的,但是如何定义完整的LSTM层呢?是input_shape
隐式创建的块数量与time_steps
的数量一样(根据我的说法,这是我代码段中input_shape
参数的第一个参数?
感谢点燃我
编辑:对于有状态的LSTM模型,还可以清楚地详细说明如何重塑大小为(n_samples, n_features)
的数据吗?如何处理time_steps和batch_size?
答案 0 :(得分:2)
单位数是内部向量状态LSTM的h
和c
的大小(长度)。不管输入的形状如何,i
,f
和o
门的各种内核都会将其按比例放大(通过密集转换)。链接的文章中详细介绍了如何将所得的潜在特征转换为h
和c
。在您的示例中,数据的输入形状
(batch_size, timesteps, input_dim)
将转换为
(batch_size, timesteps, 4)
如果return_sequences
为真,否则仅将最后一个h
设为(batch_size, 4)
。我建议使用更高的潜在维度,对于大多数问题,可能使用128或256。
答案 1 :(得分:2)
您可以(完全)想到它,就像您想到完全连接的层一样。单位是神经元。
与大多数众所周知的图层类型一样,输出的维数是神经元的数量。
不同之处在于,在LSTM中,这些神经元不会完全彼此独立,而是由于掩盖下的数学运算而相互通信。
在进一步介绍之前,可能有兴趣看一下有关LSTM,其输入/输出以及stative = true / false:Understanding Keras LSTMs的用法的非常完整的说明。请注意,您的输入形状应为input_shape=(look_back, 1)
。输入形状适用于(time_steps, features)
。
input_shape = (batch_size, arbitrary_steps, 3)
每个LSTM层将不断重复使用相同的单元/神经元,直到处理输入中的所有任意时间步长为止。
(batch, arbitrary_steps, units)
,如果return_sequences=True
。 (batch, units)
,如果return_sequences=False
。 units
。 units
。 确切地说,将有两组单元,一组处理原始输入,另一组处理来自最后一步的已处理输入。由于内部结构的原因,每个组的参数数量比单位数量大4倍(这4个与图像无关,它是固定的)。
流量:
return_sequences=False
)或全部(return_sequences = True
)步骤
return_sequences=False
)或全部(return_sequences = True
)步骤答案 2 :(得分:1)
首先,LSTM中的units
是 NOT (time_steps)。
每个LSTM单元(以给定的time_step存在)接受输入x
并形成一个隐藏状态向量a
,该隐藏单元向量的长度就是所谓的units
在LSTM(Keras)中。
请记住,该代码仅创建一个RNN单元
keras.layers.LSTM(units, activation='tanh', …… )
和RNN操作由类本身重复Tx次。
我已链接this来帮助您通过非常简单的代码更好地理解它。
答案 3 :(得分:0)
实际上,正确的说法是-对于一个时间步长的大小输入,您需要1个单元状态(大小为4的向量)和1个隐藏状态(大小为4的向量)和1个输出(大小为4的向量)。
因此,如果按20步输入时间序列,则将有20个(中间)单元状态,每个单元的大小为4。这是因为LSTM中的输入是顺序处理的,一个接一个地处理。同样,您将有20个隐藏状态,每个隐藏状态的大小为4。
通常,您的输出将是LAST步骤的输出(大小为4的向量)。但是,如果需要每个中间步骤的输出(请记住您要处理20个时间步),则可以使return_sequences = TRUE。在这种情况下,您将拥有20个4个大小的向量,每个向量告诉您当处理这些步骤中的每个步骤时输出的是什么,因为那20个输入是一个接一个的输入。
如果将return_states = TRUE放置,则会得到大小为4的最后一个隐藏状态和大小为4的最后一个单元状态。