Keras中units参数的含义如何解释清楚?
Posted
技术标签:
【中文标题】Keras中units参数的含义如何解释清楚?【英文标题】:How to interpret clearly the meaning of the units parameter in Keras? 【发布时间】:2019-01-26 16:52:00 【问题描述】:我想知道 LSTM 在 Keras 中是如何工作的。例如,在this tutorial 中,和许多其他地方一样,您可以找到类似这样的内容:
model.add(LSTM(4, input_shape=(1, look_back)))
“4”是什么意思。是层中神经元的数量吗?我所说的神经元是指每个实例都提供一个输出的东西?
实际上,我找到了this brillant discussion,但对the reference given中提到的解释并没有真正信服。
在方案上,可以看到num_units
illustrated,我认为我说这个单元中的每一个都是一个非常原子的 LSTM 单元(即 4 个门)并没有错。但是,这些单元是如何连接的?如果我是对的(但不确定),x_(t-1)
的大小是 nb_features
,所以每个特征都是一个单元的输入,num_unit
必须等于 nb_features
对吗?
现在,让我们谈谈 keras。我已阅读this post and the accepted answer 并遇到了麻烦。确实,答案是:
基本上,形状就像 (batch_size, timespan, input_dim),其中input_dim
可以不同于unit
在什么情况下?我之前的参考资料有问题...
此外,它说,
Keras 中的 LSTM 只定义了一个 LSTM 块,其单元是单位长度的。
好的,但是如何定义完整的 LSTM 层?是input_shape
隐含地创建了与time_steps
数量一样多的块(据我所知,这是我的代码中input_shape
参数的第一个参数?
谢谢你照亮我
编辑:是否也可以清楚地详细说明如何为有状态 LSTM 模型重塑大小为(n_samples, n_features)
的数据? time_steps 和 batch_size 怎么处理?
【问题讨论】:
【参考方案1】:首先,LSTM 中的units
不是 time_steps 的数量。
每个 LSTM 单元(出现在给定的 time_step)接受输入 x
并形成一个隐藏状态向量 a
,这个隐藏单位向量的长度就是 LSTM(Keras) 中所谓的 units
。
您应该记住,代码只创建了一个 RNN 单元
keras.layers.LSTM(units, activation='tanh', …… )
RNN 操作由类本身重复 Tx 次。
我已链接this 以帮助您使用非常简单的代码更好地理解它。
【讨论】:
【参考方案2】:我会这样说 - 有 4 个 LSTM“神经元”或“单元”,每个处理的每个时间步都有 1 个细胞状态和 1 个隐藏状态。因此,对于 1 个时间步处理的输入,您将有 4 个单元状态、4 个隐藏状态和 4 个输出。
实际上正确的说法是 - 对于一个时间步长的输入,您需要 1 个单元状态(大小为 4 的向量)和 1 个隐藏状态(大小为 4 的向量)和 1 个输出(大小为 4 的向量)。
因此,如果您输入一个包含 20 个步骤的时间序列,您将有 20 个(中间)单元状态,每个大小为 4。这是因为 LSTM 中的输入是按顺序处理的,一个接一个。同样,您将有 20 个隐藏状态,每个大小为 4。
通常,您的输出将是最后一步的输出(大小为 4 的向量)。但是,如果您想要每个中间步骤的输出(记住您有 20 个时间步要处理),您可以让 return_sequences = TRUE。在这种情况下,您将拥有 20 、 4 个大小的向量,每个向量都告诉您在处理每个步骤时的输出是什么,因为这 20 个输入一个接一个地出现。
如果你输入 return_states = TRUE ,你会得到最后一个大小为 4 的隐藏状态和最后一个大小为 4 的单元状态。
【讨论】:
【参考方案3】:您可以(在某种程度上)完全按照您对全连接层的看法来思考它。单位是神经元。
输出的维度是神经元的数量,与大多数众所周知的层类型一样。
不同之处在于,在 LSTM 中,这些神经元不会完全相互独立,它们会因为隐藏在背后的数学运算而相互通信。
在进一步讨论之前,看看这个关于 LSTM、它的输入/输出和 statative = true/false 的使用的非常完整的解释可能会很有趣:Understanding Keras LSTMs。请注意,您的输入形状应为input_shape=(look_back, 1)
。输入形状为(time_steps, features)
。
虽然这是一系列全连接层:
隐藏层 1:4 个单位 隐藏层 2:4 个单位 输出层:1 个单位这是一系列 LSTM 层:
在哪里input_shape = (batch_size, arbitrary_steps, 3)
每个 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
) 步骤
【讨论】:
感谢您的精彩解释。您在这里看到我的问题了吗:***.com/questions/52071751/…?如果你能回答我会很高兴,因为我没有找到关于它的高质量答案......非常感谢【参考方案4】:单元数是内部向量状态的大小(长度),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。
【讨论】:
@MysteryGuy LSTM 下的链接。 那么,h
和 c
是 dim 1 的向量,对吧?那里面的表示呢:knowledgemapper.com/knowmap/knowbook/…:在这种情况下,单位是什么意思?
在this 解释说units
是该层LSTM 单元的数量后,我对此表示怀疑。你同意吗?以上是关于Keras中units参数的含义如何解释清楚?的主要内容,如果未能解决你的问题,请参考以下文章