`Keras` 的 `Dense` 和 `TimeDistributedDense` 的区别

数据挖掘 机器学习 神经网络 喀拉斯
2021-09-27 21:01:10

即使已经在这里这里提出了一些类似的问题,我仍然对 和 之间的区别Dense感到TimeDistributedDense困惑人们讨论了很多,但没有达成一致的结论。Keras

即使在这里,@fchollet 表示:

TimeDistributedDense对 3D 张量的每个时间步应用相同的Dense(完全连接的)操作。

我仍然需要详细说明它们之间的确切区别。

1个回答

假设您有时间序列数据N行和700您想要馈送到SimpleRNN(200, return_sequence=True)Keras 中的图层的列。在将其提供给 RNN 之前,您需要将之前的数据重塑为 3D 张量。所以它变成了一个N×700×1.

展开的 RNN

图片取自https://colah.github.io/posts/2015-08-Understanding-LSTMs

在 RNN 中,您的列(“700 列”)是 RNN 的时间步长。您的数据处理自t=1 to 700. 将数据输入 RNN 后,现在它有 700 个输出h1h700, 不是 h1h200. 请记住,现在数据的形状是N×700×200这是样本(行)x时间步(列)x通道

然后,当您应用 a 时TimeDistributedDense,您将Dense在每个时间步上应用一个图层,这意味着您在每个时间步上应用一个Dense图层h1, h2,...,ht分别。这意味着:实际上,您分别在其每个通道(“200”通道)上应用完全连接的操作,来自h1h700. 第一个“1×1×200“直到第 700 个”1×1×200”。

我们为什么要这样做呢?因为您不想展平 RNN 输出。

为什么不扁平化 RNN 输出?因为您希望将每个时间步长值分开。

为什么将每个时间步长值分开?因为:

  • 您只想在其自己的时间步之间交互值
  • 您不希望在不同的时间步长和通道之间进行随机交互。