为什么不使用Flatten紧随其后的是Dense层而不是TimeDistributed?

时间:2018-12-07 13:15:07

标签: tensorflow machine-learning keras lstm keras-layer

我试图更好地理解Keras层。我正在研究一个序列到序列模型,在该模型中我嵌入了一个句子并将其传递给返回序列的LSTM。此后,我想在句子中的每个时间步(单词)上应用一个密集层,并且像这种情况下,TimeDistributed似乎可以处理三维张量。

据我了解,密集层仅适用于二维张量,而TimeDistributed只是在三个时间的每个时间步上应用相同的密度。难道不能然后简单地弄平时间步长,应用密集的图层并执行重塑以获得相同的结果,或者这些以我遗漏的某种方式不等同吗?

3 个答案:

答案 0 :(得分:4)

密集层可以作用于任何张量,而不一定是2级。而且我认为TimeDistributed包装器不会改变密集层的作用方式。仅将Dense层应用于等级3的张量将与应用Dense层的TimeDistributed包装器完全相同。这是插图:

from tensorflow.keras.layers import *
from tensorflow.keras.models import *

model = Sequential()

model.add(Dense(5,input_shape=(50,10)))

model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_5 (Dense)              (None, 50, 5)             55        
=================================================================
Total params: 55
Trainable params: 55
Non-trainable params: 0
_________________________________________________________________
model1 = Sequential()

model1.add(TimeDistributed(Dense(5),input_shape=(50,10)))

model1.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
time_distributed_3 (TimeDist (None, 50, 5)             55        
=================================================================
Total params: 55
Trainable params: 55
Non-trainable params: 0
_________________________________________________________________

答案 1 :(得分:1)

想象一下,您有四个时间步长,每个时间步长包含一个3元素向量。让我们用这个来表示:

Input batch

现在,您要使用密集层来转换此批处理,因此每个时间步获得5个要素。图层的输出可以表示为以下形式:

Output batch

您考虑两个选项:TimeDistributed密集层,或将其重塑为平面输入,应用密集层并将其重塑为时间步长。

在第一个选项中,您将在每个时间步上应用具有3个输入和5个输出的密集层。看起来可能像这样:

TimeDistributed layer

每个蓝色圆圈是密集层中的一个单位。通过在每个输入时间步执行此操作,您可以获得总输出。重要的是,这五个单位在所有时间步上都是相同的,因此您只有一个具有3个输入和5个输出的单个密集层的参数。

第二个选项将涉及将输入展平为12个元素的向量,应用具有12个输入和20个输出的密集层,然后将其重新成形。外观如下:

Flat dense layer

为清楚起见,此处仅画出一个单元的输入连接,但是每个单元都将连接到每个输入。在这里,显然,您有更多的参数(具有12个输入和20个输出的密集层的参数),并且还要注意每个输出值受每个输入值的影响,因此一个时间步长的值会影响其他时间步长的输出。这是好事还是坏事取决于您的问题和模型,但是与上一个步骤(输入和输出的每个时间都是独立的)相比,这是一个重要的区别。除此之外,此配置还要求您在每个批处理中使用固定数量的时间步长,而前一个工作原理与时间步长的数量无关。

您还可以考虑具有四个密集层的选项,每个层都独立应用于每个时间步长(我没有画出来,但希望您能理解)。这与前一个相似,只有每个单元仅从其各自的时间步长输入接收输入连接。我认为在Keras中没有简单的方法可以做到这一点,您必须将输入分成四个部分,对每个部分应用密集的层,然后合并输出。同样,在这种情况下,时间步数将是固定的。

答案 2 :(得分:1)

除了上述答案外, 这是比较两层输出形状的几张图片。因此,例如在LSTM之后使用这些层之一时,将具有不同的行为。 enter image description here