TimeDistributed包装器对LSTM或其他任何层有什么用途

时间:2018-11-01 18:20:13

标签: tensorflow machine-learning neural-network keras deep-learning

我试图了解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层有何不同?

  

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

这两者有什么区别?

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

1 个答案:

答案 0 :(得分:1)

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

以下是一个可能有帮助的示例:

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

好吧,一个漏洞就是使用诸如Conv2D之类的CNN从每个帧中提取一些“特征”,然后将它们传递给LSTM层。但是每个帧的特征提取都是相同的。现在,TimeDistributed可以救援。您可以用它包装Conv2D,然后将输出传递给同样由TimeDistributed包装的Flatten层。因此,在应用TimeDistributed(Conv2D(...))之后,输出将是暗淡的,如(None,50,5,5,16),而在TimeDistributed(Flatten())之后,输出将是暗淡的(None ,50、400)。 (实际的暗淡取决于Conv2D参数。)

该层的输出现在可以通过LSTM传递。

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