如何清楚地解释Keras中的units参数的含义?

时间:2018-08-20 14:18:12

标签: python keras lstm

我想知道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?

4 个答案:

答案 0 :(得分:2)

单位数是内部向量状态LSTMhc的大小(长度)。不管输入的形状如何,ifo门的各种内核都会将其按比例放大(通过密集转换)。链接的文章中详细介绍了如何将所得的潜在特征转换为hc。在您的示例中,数据的输入形状

(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)

这是一系列完全连接的层:

  • 隐藏层1: 4个单位
  • 隐藏层2: 4个单位
  • 输出层: 1个单位 fully connected layers

这是一系列LSTM层:

input_shape = (batch_size, arbitrary_steps, 3)

enter image description here

每个LSTM层将不断重复使用相同的单元/神经元,直到处理输入中的所有任意时间步长为止。

  • 输出将具有以下形状:
    • (batch, arbitrary_steps, units),如果return_sequences=True
    • (batch, units),如果return_sequences=False
  • 内存状态的大小为units
  • 从最后一步处理的输入的大小为units

确切地说,将有两组单元,一组处理原始输入,另一组处理来自最后一步的已处理输入。由于内部结构的原因,每个组的参数数量比单位数量大4倍(这4个与图像无关,它是固定的)。

流量:

  • 以n步和3个功能进行输入
  • 第1层:
    • 对于输入中的每个时间步:
      • 在输入上使用4个单位来获得大小为4的结果
      • 在上一步的输出上使用4个递归单位
    • 输出最后(return_sequences=False)或全部(return_sequences = True)步骤
      • 输出功能= 4
  • 第2层:
    • 与第1层相同
  • 第3层:
    • 对于输入中的每个时间步:
      • 在输入上使用1个单位可获得大小为1的结果
      • 在上一步的输出上使用1单位
    • 输出最后(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)

我会这样说-有4个LSTM“神经元”或“单元”,每个处理的时间步长都有1个单元状态和1个隐藏状态。因此,对于1个时间步处理的输入,您将具有4个单元状态,4个隐藏状态和4个输出。

实际上,正确的说法是-对于一个时间步长的大小输入,您需要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的最后一个单元状态。