我试图更好地理解Keras层。我正在研究一个序列到序列模型,在该模型中我嵌入了一个句子并将其传递给返回序列的LSTM。此后,我想在句子中的每个时间步(单词)上应用一个密集层,并且像这种情况下,TimeDistributed似乎可以处理三维张量。
据我了解,密集层仅适用于二维张量,而TimeDistributed只是在三个时间的每个时间步上应用相同的密度。难道不能然后简单地弄平时间步长,应用密集的图层并执行重塑以获得相同的结果,或者这些以我遗漏的某种方式不等同吗?
答案 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元素向量。让我们用这个来表示:
现在,您要使用密集层来转换此批处理,因此每个时间步获得5个要素。图层的输出可以表示为以下形式:
您考虑两个选项:TimeDistributed
密集层,或将其重塑为平面输入,应用密集层并将其重塑为时间步长。
在第一个选项中,您将在每个时间步上应用具有3个输入和5个输出的密集层。看起来可能像这样:
每个蓝色圆圈是密集层中的一个单位。通过在每个输入时间步执行此操作,您可以获得总输出。重要的是,这五个单位在所有时间步上都是相同的,因此您只有一个具有3个输入和5个输出的单个密集层的参数。
第二个选项将涉及将输入展平为12个元素的向量,应用具有12个输入和20个输出的密集层,然后将其重新成形。外观如下:
为清楚起见,此处仅画出一个单元的输入连接,但是每个单元都将连接到每个输入。在这里,显然,您有更多的参数(具有12个输入和20个输出的密集层的参数),并且还要注意每个输出值受每个输入值的影响,因此一个时间步长的值会影响其他时间步长的输出。这是好事还是坏事取决于您的问题和模型,但是与上一个步骤(输入和输出的每个时间都是独立的)相比,这是一个重要的区别。除此之外,此配置还要求您在每个批处理中使用固定数量的时间步长,而前一个工作原理与时间步长的数量无关。
您还可以考虑具有四个密集层的选项,每个层都独立应用于每个时间步长(我没有画出来,但希望您能理解)。这与前一个相似,只有每个单元仅从其各自的时间步长输入接收输入连接。我认为在Keras中没有简单的方法可以做到这一点,您必须将输入分成四个部分,对每个部分应用密集的层,然后合并输出。同样,在这种情况下,时间步数将是固定的。
答案 2 :(得分:1)