在 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 中使用 `predict` 以与给定相同的顺序预测一维数组
当我将numpy数组作为输入传递给keras层时,它具有不同的形状