我在一个开源实现中遇到了以下代码片段,以实现多层lstm单元:
变量:
fw_cell
和bw_cell
是先前创建的LSTM
个退出单元。
self.word_embeddings_1
是3维张量,形状为[batchsize , timesteps , embeddingdimension]
self.sequence_lengths_1
给出每个条目的序列长度,并有shape [batchsize]
for _ in range(self.num_layers_encoder):
(out_fw, out_bw), (state_fw, state_bw) = tf.nn.bidirectional_dynamic_rnn(
cell_fw=fw_cell,
cell_bw=bw_cell,
inputs=self.word_embeddings_1,
sequence_length=self.sequence_lengths_1,
dtype=tf.float32)
encoder_outputs = tf.concat((out_fw, out_bw), -1)
bi_state_c = tf.concat((state_fw.c, state_bw.c), -1)
bi_state_h = tf.concat((state_fw.h, state_bw.h), -1)
bi_lstm_state = tf.nn.rnn_cell.LSTMStateTuple(c=bi_state_c, h=bi_state_h)
encoder_state = tuple([bi_lstm_state] * self.num_layers_encoder)
我看不到for循环如何实现所需的实现
在我看来,在for循环的每次迭代中,变量encoder_outputs似乎都被LSTM退出单元的输出覆盖,如果传递给LSTM单元的输入更改为先前的LSTM单元的编码器输出,那就很好了州。如果每次迭代都没有变化,for循环的迭代看起来是否多余?另外,应该有一个追加功能,而不是仅仅分配?像
encoder_outputs = encoder_outputs.append(tf.concat((out_fw,out_bw),-1)))
还是我只是想念一些东西?