Why not use Flatten followed by a Dense layer instead of TimeDistributed?
我试图更好地理解Keras层。 我正在研究一个序列到序列模型,在该模型中嵌入一个句子并将其传递给返回序列的LSTM。 此后,我想对句子中的每个时间步(单词)都应用一个密集层,并且像这种情况下,TimeDistributed似乎可以完成三维张量的工作。
以我的理解,密集层仅适用于二维张量,而TimeDistributed仅在三个时间的每个时间步上应用相同的密度。 难道不能然后简单地弄平时间步长,应用密集的层并执行重塑以获得相同的结果,或者这些以我遗漏的某种方式不等同吗?
密集层可以作用于任何张量,不一定是2级。而且我认为TimeDistributed包装器不会改变密集层的作用方式。仅将Dense层应用于等级3的张量将与应用Dense层的TimeDistributed包装器完全相同。这是插图:
1 2 3 4 5 6 7 8 | from tensorflow.keras.layers import * from tensorflow.keras.models import * model = Sequential() model.add(Dense(5,input_shape=(50,10))) model.summary() |
1 2 3 4 5 6 7 8 9 | _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_5 (Dense) (None, 50, 5) 55 ================================================================= Total params: 55 Trainable params: 55 Non-trainable params: 0 _________________________________________________________________ |
1 2 3 4 5 | model1 = Sequential() model1.add(TimeDistributed(Dense(5),input_shape=(50,10))) model1.summary() |
1 2 3 4 5 6 7 8 9 | _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= time_distributed_3 (TimeDist (None, 50, 5) 55 ================================================================= Total params: 55 Trainable params: 55 Non-trainable params: 0 _________________________________________________________________ |
除了上述答案,
这是比较两层输出形状的几张图片。因此,例如,在LSTM之后使用这些层之一时,将具有不同的行为。
假设您有一批4个时间步长,每个时间步长都包含3个元素的向量。让我们用这个来表示:
现在,您要使用密集层对该批次进行转换,因此每个时间步长可获得5个要素。图层的输出可以表示为以下形式:
您考虑两个选项:
在第一个选项中,您将在每个时间步上应用具有3个输入和5个输出的密集层。可能看起来像这样:
这里的每个蓝色圆圈是密集层中的一个单位。通过在每个输入时间步执行此操作,您可以获得总输出。重要的是,这五个单位在所有时间步中都相同,因此您只有一个具有3个输入和5个输出的单个密集层的参数。
第二种选择是将输入平坦化为12个元素的向量,应用具有12个输入和20个输出的密集层,然后将其重新成形。它是这样的:
为了清楚起见,此处仅画出一个单元的输入连接,但是每个单元都将连接到每个输入。在这里,显然,您有更多的参数(具有12个输入和20个输出的密集层的参数),并且还要注意每个输出值受每个输入值的影响,因此一个时间步长的值会影响其他时间步长的输出。这是好事还是坏事取决于您的问题和模型,但是与上一个步骤(输入和输出的每个时间都是独立的)相比,这是一个重要的区别。除此之外,此配置要求您在每个批次上使用固定数量的时间步长,而前一个工作原理与时间步长的数量无关。
您还可以考虑具有四个密集层的选项,每个层独立应用于每个时间步长(我没有画出来,但希望您能理解)。这将与前一个类似,只有每个单元只能从其各自的时间步长输入接收输入连接。我认为在Keras中没有简单的方法可以做到这一点,您必须将输入分成四个部分,对每个部分应用密集的层,然后合并输出。同样,在这种情况下,时间步数将是固定的。