首页 文章

为什么不使用Flatten后跟Dense层而不是TimeDistributed?

提问于
浏览
1

我想更好地理解Keras层 . 我正在研究序列模型,我在其中嵌入一个句子并将其传递给返回序列的LSTM . 此后,我想在句子中的每个时间步(单词)上应用Dense图层,看起来TimeDistributed就像这种情况一样为三维张量工作 .

根据我的理解,密集层仅适用于二维张量,而TimeDistributed只是在三维中的每个时间步长上应用相同的密度 . 然后,不能简单地压平时间步,应用密集层并执行重塑以获得相同的结果,或者这些不是以我错过的某种方式相当于?

1 回答

  • 1

    想象一下,你有一批4个时间步骤,每个步骤包含一个3元素矢量 . 让我们用这个代表:

    Input batch

    现在,您希望使用密集层转换此批处理,因此每个时间步可获得5个功能 . 图层的输出可以表示为:

    Output batch

    您可以考虑两个选项,一个 TimeDistributed 密集层,或重塑为平面输入,应用密集层并重新塑造回时间步 .

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

    TimeDistributed layer

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

    第二种选择包括将输入展平为12元素向量,应用具有12个输入和20个输出的密集层,然后将其重新整形 . 这是它的样子:

    Flat dense layer

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

    您还可以考虑选择具有四个密集层,每个层都独立应用于每个时间步(我没有绘制它,但希望您能得到这个想法) . 这与前一个类似,只有每个单元仅从其各自的时间步长输入接收输入连接 . 我不认为在Keras中有一种直接的方法,你必须将输入分成四个,对每个部分应用密集层并合并输出 . 同样,在这种情况下,时间步数将被固定 .

相关问题