Keras LSTM TimeDistributed,有状态

Posted

技术标签:

【中文标题】Keras LSTM TimeDistributed,有状态【英文标题】:Keras LSTM TimeDistributed, stateful 【发布时间】:2018-04-04 10:35:24 【问题描述】:

有没有详细的解释 TimeDistributed、stateful 和 return_sequences 是如何工作的?在这两种情况下我都必须设置 shuffle=False 吗?它适用于windows(1-11、2-12、3-13等)还是应该批量使用(1-11、12-22、13-33等)

我对 LSTM 层特别感兴趣。

【问题讨论】:

【参考方案1】:

时间分布:

这不会影响图层的工作方式。 这样做的目的是增加一个“时间”(可能也不是时间)维度。考虑到这个时间维度,包裹层将应用于输入张量的每个切片。

例如,如果一个层需要一个 3 维的输入形状,比如 (batch, length, features),使用 TimeDistributed 包装器将使其需要 4 维:(batch, timeDimension, length, features)

然后该层将被“复制”并平等地应用于时间维度中的每个元素。

使用 LSTM 层,它的工作原理相同。尽管 LSTM 层在其输入形状中已经期望一个时间维度:(batch, timeSteps, features),但您可以使用TimeDistributed 添加另一个“时间”维度(可能意味着任何东西,而不是确切的时间)并制作这个LSTM 层为这个新时间维度中的每个元素重复使用。

LSTM - 期望输入 (batch, timeSteps, features) TimeDistributed(LSTM()) - 期望输入 (batch, superSteps, timeSteps, features)

在任何情况下,LSTM 实际上只会在timeSteps 维度中执行其循环计算。另一个时间维度只是多次复制这一层。

时间分布 + 密集:

Dense 层(可能还有其他一些)已经支持 3D 输入,尽管标准是 2D:(batch, inputFeatures)

是否使用 TimeDistributed 与 Dense 层是可选的,结果是相同的:如果您的数据是 3D,则 Dense 层将在第二维重复。

返回序列:

这在documentation中有很好的解释。

对于循环层,keras 将使用timeSteps 维度来执行其循环步骤。每一步,自然会有一个输出。

您可以选择获取所有步骤的输出 (return_sequences=True) 或仅获取最后一个输出 (return_sequences=False)

考虑像(batch, timeSteps, inputFeatures) 这样的输入形状和具有outputFeatures 单位的层:

return_sequences=True时,输出形状为(batch, timeSteps, outputFeatures) return_sequences=False时,输出形状为(batch, outputFeatures)

无论如何,如果您使用TimeDistributed 包装器,superSteps 维度将在输入和输出中保持不变。

有状态 = 真

通常,如果您可以将所有序列及其所有步骤放入一个输入数组中,那么一切都很好,您不需要stateful=True 层。

Keras 为批次中的每个序列创建一个“状态”。批次维度等于序列的数量。当 keras 处理完一个批次后,它会自动重置状态,意思是:我们到达了序列的末尾(最后一个时间步),从第一步开始带来新的序列。

使用stateful=True 时,这些状态不会被重置。这意味着向模型发送另一个批次不会被解释为一组新的序列,而是之前处理过的序列的额外步骤。然后你必须手动model.reset_states() 告诉模型你已经到达序列的最后一步,或者你将开始新的序列。

唯一需要shuffle=False 的情况是stateful=True 情况。因为对于每个批次,输入了许多序列。在每个批次中,这些序列必须保持相同的顺序,这样每个序列的状态就不会混合。

有状态层适用于:

数据太大。如果你一次使用所有时间步,它不适合你的记忆 您希望连续生成时间步长并将这些新步长作为输入包含在下一个步长中,而不需要固定大小。 (您自己在代码中创建这些循环) (来自其他用户的任何 cmets??)

使用窗口

到目前为止,我可以使用 Windows 的唯一方法是复制数据。

输入数组应该在窗口中组织。每个窗口步骤一个序列。如果要将所有窗口步骤保留为单个批处理条目,则可以选择利用 TimeDistributed 包装器。但是您也可以将所有步骤设置为单独的序列。

stateful=True 层由于这些状态而无法与 Windows 一起使用。如果您批量输入从 1 到 12 的步骤,则下一批将期望步骤 13 作为保持连接的第一步。

【讨论】:

“superSteps”是什么意思? 任何你想要的。超过时间步长。 您好,如何在 TimeDistributed LSTM 中手动插入状态? 我猜我们不需要'superSteps'。

以上是关于Keras LSTM TimeDistributed,有状态的主要内容,如果未能解决你的问题,请参考以下文章

Keras:LSTM dropout 和 LSTM 循环 dropout 的区别

Keras 中的 CuDNNLSTM 和 LSTM 有啥区别?

Keras 的 LSTM 中的时间步长是多少?

将 Pytorch LSTM 的状态参数转换为 Keras LSTM

如何在keras中堆叠多个lstm?

如何使用 Keras 实现深度双向 LSTM?