LSTM 或任何其他层的 TimeDistributed 包装器有啥用途

Posted

技术标签:

【中文标题】LSTM 或任何其他层的 TimeDistributed 包装器有啥用途【英文标题】:What are the uses of TimeDistributed wrapper for LSTM or any other layersLSTM 或任何其他层的 TimeDistributed 包装器有什么用途 【发布时间】:2019-04-06 00:32:30 【问题描述】:

我正在尝试了解 keras/tensorflow 中 TimeDistributed 层的使用。我已经阅读了一些主题和文章,但仍然没有正确理解。

让我对 TImeDistributed 层的作用有了一些了解的线程是 -

What is the role of TimeDistributed layer in Keras?

TimeDistributed(Dense) vs Dense in Keras - Same number of parameters

但我仍然不知道为什么实际使用该层!

例如,以下两个代码将提供相同的输出(& output_shape):

model = Sequential()
model.add(TimeDistributed(LSTM(5, input_shape = (10, 20), return_sequences = True)))
print(model.output_shape)

model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
print(model.output_shape)

输出形状将是(据我所知)-

(None, 10, 5)

那么,如果两个模型都提供相同的输出,那么 TimeDistributed Layer 究竟有什么用呢?

我还有另一个问题。 TimeDistributed 层将时间相关数据应用于单独的层(共享相同的权重)。那么,它与将 keras API 中提供的 LSTM 层展开有什么不同:

展开:布尔值(默认为 False)。如果为 True,则网络将展开,否则将使用符号循环。展开可以加速 RNN,尽管它往往更占用内存。展开仅适用于短序列。

这两者有什么区别?

谢谢..我还是个新手,所以有很多问题。

【问题讨论】:

【参考方案1】:

正如 Keras 文档所建议的那样,TimeDistributed 是一个包装器,它将一个层应用于输入的每个时间切片。

这是一个可能有帮助的例子:

假设您有猫的视频样本,而您的任务是一个简单的视频分类问题,如果猫没有移动则返回 0,如果猫在移动则返回 1。假设您的输入暗淡为 (None, 50, 25, 25, 3),这意味着您每个样本有 50 个时间步或帧,并且您的帧是 25 x 25 并且有 3 个通道,rgb。

好吧,一种方法是使用 CNN 从每一帧中提取一些“特征”,例如 Conv2D,然后将它们传递给 LSTM 层。但是每一帧的特征提取都是一样的。现在 TimeDistributed 来救援了。你可以用它来包装你的 Conv2D,然后将输出传递给同样由 TimeDistributed 包装的 Flatten 层。所以在应用 TimeDistributed(Conv2D(...)) 之后,输出会像 (None, 50, 5, 5, 16) 一样暗淡,而在 TimeDistributed(Flatten()) 之后,输出会变得暗淡 (None , 50, 400)。 (实际的暗淡取决于 Conv2D 参数。)

这一层的输出现在可以通过 LSTM。

很明显,LSTM 本身不需要 TimeDistributed 包装器。

【讨论】:

真棒解释,你刚刚让我明白 TimeDistribuited 有什么用处。赞一个! @SaTa 你能解释一下为什么每帧的特征提取都是一样的吗? @AlwaysNull 这就是我大部分时间看到它发生的方式。跨时间拥有固定的 CNN 网络。你的意思是为什么不在每个时间步都有不同的架构? @AlwaysNull 因为“猫”不会从一帧到下一帧转换为“桌子”。 LSTM 层后面的网络只需要推断猫的姿势变化。 @Unknown,“每一帧的特征提取都是相同的”而不是“基本相同”,因为只有一个 CNN 正在接受训练。因此,在每个时间步都提取相同的特征。虽然不会有相同的值,但它们是相同的功能。一个简单的例子是 CNN 学习将像素值的均值和最大值作为两个特征返回。这些特征将在所有帧中保持相同的功能,但根据每个时间帧的像素具有不同的值。

以上是关于LSTM 或任何其他层的 TimeDistributed 包装器有啥用途的主要内容,如果未能解决你的问题,请参考以下文章

pytorch 中LSTM模型获取最后一层的输出结果,单向或双向

如何关闭/打开 LSTM 层?

TensorFlow1.4之LSTM的使用

Tensorflow 中 LSTM 层的门权重顺序

如何将 keras LSTM 层的输出输入到输入层?

带有嵌入层的 Keras LSTM 自动编码器