正如论文中的架构所建议的那样,您基本上希望将每个隐藏状态(它们本身是时间分布的)推入单独的密集层(从而在每个时间状态形成一个 MLP)。
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
bidirectional (Bidirectional (None, 200, 128) 51200
_________________________________________________________________
bidirectional_1 (Bidirection (None, 200, 80) 54080
_________________________________________________________________
time_distributed (TimeDistri (None, 200, 40) 3240
_________________________________________________________________
time_distributed_1 (TimeDist (None, 200, 10) 410
_________________________________________________________________
time_distributed_2 (TimeDist (None, 200, 1) 11
=================================================================
Total params: 108,941
Trainable params: 108,941
Non-trainable params: 0
这里的 Bi-LSTM 设置为return_sequence = True
。因此它将隐藏状态序列返回到后续层。如果将此序列推入 Dense 层,则没有意义,因为您将返回 3D 张量(batch, time, feature)
。现在,如果你想每次都形成一个密集的网络,你需要它是时间分布的。
正如输出形状所暗示的那样,该层在 200 个时间步长的每一个处创建一个 40 个节点层,这是之前 Bi-LSTM 的输出(隐藏状态)。然后每一个都堆叠有 10 个节点层(None, 200, 10)
。同样,逻辑如下。
如果您怀疑 TimeDistributed 层是什么 - 根据官方文档。
该包装器允许将层应用于输入的每个时间切片。
最终目标是speaker change detection
。这意味着您要在 200 个时间步长中的每个时间步预测说话者或说话者的概率。因此输出层返回 200 logits (None, 200, 1)
。
希望能解决你的困惑。
另一种直观的看待它的方式 -
您的 Bi-LSTM 设置为返回序列而不仅仅是特征。返回的这个序列中的每个时间步都需要有一个自己的密集网络。TimeDistributed Dense 基本上是一个层,它接收一个输入序列,并在每个时间步将其输入到单独的密集节点。因此,它不是像标准密集层那样有 40 个节点,而是有 200 X 40 个节点,其中第 3 个 40 个节点的输入是 Bi-LSTM 的第 3 个时间步。这模拟了 Bi-LSTM 序列上的时间分布 MLP。
使用 LSTM 时我更喜欢的良好视觉直觉 -
- 如果您不返回序列,则 LSTM 的输出只是
ht
(下图的 LHS)的单个值
- 如果返回序列,则输出是序列 (
h0
to ht
)(下图的 RHS)
添加一个密集层,在第一种情况下只会ht
作为输入。在第二种情况下,您将需要一个 TimeDistributed Dense,它将“堆叠”在每个h0
to之上ht
。