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_unitsillustrated,我认为我说这个单元中的每一个都是一个非常原子的 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 的hc。这与输入的形状无关,它被ifo 门的各种内核放大(通过密集变换)。链接帖子中描述了如何将生成的潜在特征转换为hc 的详细信息。在您的示例中,数据的输入形状

(batch_size, timesteps, input_dim)

将转换为

(batch_size, timesteps, 4)

如果return_sequences 为真,否则只有最后一个h 将被生成为(batch_size, 4)。对于大多数问题,我建议使用更高的潜在维度,可能是 128 或 256。

【讨论】:

@MysteryGuy LSTM 下的链接。 那么,hc 是 dim 1 的向量,对吧?那里面的表示呢:knowledgemapper.com/knowmap/knowbook/…:在这种情况下,单位是什么意思? 在this 解释说units 是该层LSTM 单元的数量后,我对此表示怀疑。你同意吗?

以上是关于Keras中units参数的含义如何解释清楚?的主要内容,如果未能解决你的问题,请参考以下文章

keras 风格转移示例有一个无法解释的常数

如何确定 Keras Conv2D 函数中的“过滤器”参数

LSTMCell中num_units参数解释

LSTMCell中num_units参数解释

有人可以向我解释初始化 keras lstm 层中传递的激活参数和循环激活参数之间的区别吗?

Keras 中的“无法解释优化器标识符”错误