Я наткнулся на этот фрагмент кода в реализации с открытым исходным кодом для реализации многослойной ячейки lstm: переменные: fw_cell
и bw_cell
- это LSTM
ячейки выпадения, созданные ранее.self.word_embeddings_1
- это трехмерный тензор, который имеет форму [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 включает требуемыйреализация
Мне кажется, что в каждой итерации цикла переменная encoder_outputs кажется перезаписываемой выходными данными ячейки пропуска LSTM, что было бы хорошо, если бы входы, переданные в ячейку LSTM, были изменены наencoder_outputs предыдущего состояния.Не кажутся ли итерации цикла for избыточными, если в каждой итерации вообще нет изменений?В качестве альтернативы должна была быть функция добавления, а не просто присвоение?Например
encoder_outputs = encoder_outputs.append(tf.concat((out_fw,out_bw),-1)))
Или я что-то упускаю?