Не уверен, что происходит в этом фрагменте кода - PullRequest
0 голосов
/ 03 декабря 2018

Я наткнулся на этот фрагмент кода в реализации с открытым исходным кодом для реализации многослойной ячейки 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)))

Или я что-то упускаю?

...