我想针对序列分类问题实施基于注意力的双向LSTM。通常,此算法将softmax加权应用于每个步骤的前后LSTM的输出,并将这些加权的总和作为整个序列的最终代表特征。
我有许多不同的序列,其长度从30s到5000s不等。因此,在训练模型时,我需要将不同长度的序列打包到同一小批处理中。在没有注意力机制的情况下,我最近将state
的{{1}}输出用于基于LSTM的普通分类,如下所示,而没有详细质疑内部机制:
tf.nn.bidirectional_dynamic_rnn
问题Bi-directional LSTM for variable-length sequence in Tensorflow也提到了该解决方案。
现在,我需要从 outputs, state = tf.nn.bidirectional_dynamic_rnn(cell_fw,
cell_bw,
inputs=self.inputs,
initial_state_fw=self.initial_state_fw,
initial_state_bw=self.initial_state_bw,
sequence_length=self.sequence_length)
final_state_fw = state[0][num_layers - 1]
final_state_bw = state[1][num_layers - 1]
self.finalLstmState = tf.concat([final_state_fw.h, final_state_bw.h], 1)
开始的每一步,而Tensorflow如何处理可变长度变得非常重要。我的问题是,在给定outputs
参数的情况下,Tensorflow如何处理双向LSTM?假设最大长度为100,但是当前批次中的sequence_length
序列的长度为20,而i.th
序列的长度为30。我从Tensorflow文档中了解的是,当这些实际序列长度为馈入j.th
op,对于前向LSTM,对于序列tf.nn.bidirectional_dynamic_rnn
,正向计算应用20次,对于序列i
,应用30次,这样剩余的80 70个操作未执行;最后一个有效单元格的输出将被复制通过。后向LSTM的行为如何?直观地讲,这应该类似于在对最后20个步骤和30个步骤应用实际的LSTM操作之前分别复制初始状态80次和70次。然后,我只需要j
和outputs
序列的i
中的前20和30个条目。这真的是Tensorflow在这种情况下的表现吗?如果没有,有效的行为是什么?