在Tensorflow中将双向LSTM用于可变长度序列的正确方法

时间:2018-10-03 12:50:27

标签: python tensorflow deep-learning lstm

我想针对序列分类问题实施基于注意力的双向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次。然后,我只需要joutputs序列的i中的前20和30个条目。这真的是Tensorflow在这种情况下的表现吗?如果没有,有效的行为是什么?

0 个答案:

没有答案