在 Keras 中,当我创建具有 N 个“单元”的有状态“LSTM”层时,我到底在配置啥?

Posted

技术标签:

【中文标题】在 Keras 中,当我创建具有 N 个“单元”的有状态“LSTM”层时,我到底在配置啥?【英文标题】:In Keras, what exactly am I configuring when I create a stateful `LSTM` layer with N `units`?在 Keras 中,当我创建具有 N 个“单元”的有状态“LSTM”层时,我到底在配置什么? 【发布时间】:2017-10-31 13:52:58 【问题描述】:

普通Dense 层中的第一个参数也是units,并且是该层中神经元/节点的数量。然而,标准 LSTM 单元如下所示:

(这是“Understanding LSTM Networks”的修改版)

在 Keras 中,当我创建像 LSTM(units=N, ...) 这样的 LSTM 对象时,我实际上是在创建这些 LSTM 单元的 N 吗?还是 LSTM 单元内“神经网络”层的大小,即公式中的 W?还是别的什么?

就上下文而言,我的工作基于this example code。

以下是文档:https://keras.io/layers/recurrent/

上面写着:

units:正整数,输出空间的维度。

这让我觉得这是 Keras LSTM “层”对象的输出数量。这意味着下一层将有N 输入。这是否意味着在 LSTM 层中实际上存在N 的这些 LSTM 单元,或者可能正是 一个 LSTM 单元运行N 迭代输出这些h[t] 值中的N ,例如,从h[t-N]h[t]

如果它只定义输出的数量,这是否意味着输入仍然可以,比如说,只是 一个,还是我们必须手动创建滞后输入变量 x[t-N]x[t] , 每个由units=N 参数定义的 LSTM 单元一个?

在我写这篇文章时,我想到了return_sequences 的论点。如果设置为True,则所有N 输出都将传递到下一层,而如果设置为False,它只会将最后一个h[t] 输出传递到下一层。我说的对吗?

【问题讨论】:

stats.stackexchange.com/questions/241985/…的可能重复 @Peteris 我不认为将问题标记为跨堆栈交换站点的“重复”是一回事。这个问题也与 Keras 有关,Keras 是 Tensorflow 之上的一个抽象层。无论如何,该链接很有帮助,也是一个很好的参考,非常感谢。 检查这个 - zhuanlan.zhihu.com/p/58854907。一个很好的解释。 【参考方案1】:

您可以查看this question 了解更多信息,尽管它基于 Keras-1.x API。

基本上,unit 表示 LSTM 中内部单元的维度。因为在 LSTM 中,内部单元的维度(图中的 C_t 和 C_t-1)、输出掩码(图中的 o_t)和隐藏/输出状态(图中的 h_t)应该具有 SAME 维度,因此您输出的维度也应该是unit-length。

Keras 中的LSTM 只定义了一个 LSTM 块,其单元格为unit-length。如果您设置return_sequence=True,它将返回形状为:(batch_size, timespan, unit)。如果是false,那么它只返回形状为(batch_size, unit) 的最后一个输出。

至于输入,您应该为每个时间戳提供输入。基本上,形状类似于(batch_size, timespan, input_dim),其中input_dim 可以不同于unit。如果您只想在第一步提供输入,您可以简单地在其他时间步用零填充您的数据。

【讨论】:

所以,这意味着unit 表示每个时间步长 LSTM 单元输出的向量的大小。但是,Keras 怎么知道这些 LSTM 单元中有多少要使用 OR 来训练数据?我的意思是,很容易找出不。输入所需的 LSTM 单元数(在timespan 中指定),但是,如何找出编号。输出中需要多少个 LSTM 单元?【参考方案2】:

这是否意味着在 LSTM 层中实际存在 N 个这些 LSTM 单元,或者可能恰好一个 LSTM 单元运行 N 次迭代,输出 N 个这些 h[t] 值,例如,h[tN]最多 h[t]?

首先是正确的。在那个 Keras LSTM 层中有 N 个 LSTM 单元或单元。

keras.layers.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False) 

如果您计划创建一个包含 1 个单元的简单 LSTM 层,您将以以下方式结束: 这就是你的模型。

N=1
model = Sequential()
model.add(LSTM(N))

对于其他型号,您需要 N>1

【讨论】:

我们为什么要在one-to-one模型中使用lstm? 如果神经网络是矩阵变换后跟非线性,LSMT中有几个神经网络。我不清楚为什么我在实践中只使用单个 LSMT 单元。 那么N是蓝色单元格的数量? @dvdblk,是的,N 应该是蓝色单元格,或者LSTM out space 不是从输入时间步计算的蓝色单元格。例如,我们有一个 LSTM(32) 层,如果我们输入 (2,1,24) 对应于 (batch size, time step, features) 那么这将只有 1 个蓝色单元格。【参考方案3】:

“LSTM 链”的实例数

对 Keras 递归神经网络的“单位”参数的正确直观解释是,使用 units=1,您将获得教科书中描述的 RNN,而使用 units=n,您将获得由 n 独立副本组成的层这样的 RNN - 它们将具有相同的结构,但是由于它们将使用不同的权重进行初始化,因此它们将计算出不同的东西。

或者,您可以考虑在具有units=1 的 LSTM 中,键值 (f, i, C, h) 是标量;并且使用units=n,它们将是长度为n的向量。

【讨论】:

【参考方案4】:

“直观地”就像一个有 100 个暗淡的密集层 (Dense(100)) 将有 100 个神经元。同样,LSTM(100) 将是一层 100 个“智能神经元”,其中每个神经元都是您提到的图形,输出将是 100 维的向量

【讨论】:

以上是关于在 Keras 中,当我创建具有 N 个“单元”的有状态“LSTM”层时,我到底在配置啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 keras 的输出阶段组合多个预训练模型

在 Keras 中使用 `predict` 以与给定相同的顺序预测一维数组

当我将numpy数组作为输入传递给keras层时,它具有不同的形状

如何将Keras数据生成器(或不同方法)用于具有不同长度的多个.npy文件?

Keras CNN 参数太少

Keras:具有多个参数的 Lambda 层函数