我在尝试理解Keras/TensorFlow中TimeDistributed层的用途。我阅读了一些讨论和文章,但仍然没有完全理解。
以下是一些帮助我理解TimeDistributed层作用的讨论链接 –
Keras中的TimeDistributed(Dense)与Dense – 参数数量相同
但我仍然不明白为什么实际上会使用这个层!
例如,以下两种代码将提供相同的输出(和输出形状):
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层的实际用途是什么?
我还有另一个问题。TimeDistributed层将时间相关数据应用于不同的层(共享相同的权重)。那么,它与Keras API中提供的展开LSTM层有什么不同:
unroll: 布尔值(默认False)。如果为True,网络将被展开,否则将使用符号循环。展开可以加速RNN,尽管它往往更加消耗内存。展开仅适用于短序列。
这两者之间的区别是什么?
谢谢…我还是个新手,所以有很多问题。
回答:
根据Keras的文档,TimeDistributed是一个包装器,它将一个层应用于输入的每个时间片段。
这里有一个可能有帮助的例子:
假设你有猫的视频样本,你的任务是一个简单的视频分类问题,如果猫没有移动返回0,如果猫在移动则返回1。假设你的输入维度是(None, 50, 25, 25, 3),这意味着每个样本有50个时间步或帧,你的帧是25×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包装器。