Тензор потока: Можем ли мы использовать разные name_scope и rnn для одних и тех же lstm-ячеек? - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь создать одну сетевую архитектуру, которая состоит из 4 двунаправленных lstm, и я хочу суммировать их все и перейти к одной линейной проекции слоя.

Итак, моя структура сети:

Lstm 
Lstm
Lstm
Lstm 

Sum(All_four_lstm_last_state)

Linear_layer ( Sum ) 

Softmax( Linear_layer )

Моя путаница в том, что я создал одну функцию для ячеек Lstm, и я хочу повторно использовать ее для всех четырех rnn, но я не совсем понимаю, что такое variable_scope.

Итак, мой код выглядит так:

Сначала я создал функцию lstm ячейки:

  with tf.variable_scope('encoder'):
        # forward cell of Bi-directional lstm network



        def fr_cell():
            fr_cell_lstm = rnn.LSTMCell(num_units=rnn_num_units, forget_bias=forget_bias_)

            return rnn.DropoutWrapper(cell=fr_cell_lstm, output_keep_prob=1. - dropout, dtype=tf.float32)

        fr_cell_m = rnn.MultiRNNCell([fr_cell() for _ in range(1)], state_is_tuple=True)



    with tf.variable_scope('encoder'):



        def bw_cell():
            bw_cell_lstm = rnn.LSTMCell(num_units=rnn_num_units, forget_bias=forget_bias_)

            return rnn.DropoutWrapper(cell=bw_cell_lstm, output_keep_prob=1. - dropout, dtype=tf.float32)

        bw_cell_m = rnn.MultiRNNCell([bw_cell() for _ in range(1)], state_is_tuple=True)

Теперь у меня есть четыре RNN:

   # Bi-directional lstm network
    with tf.variable_scope('encoder') as scope:
        model, (state_c, state_h) = tf.nn.bidirectional_dynamic_rnn(
            cell_fw=fr_cell_m,  # forward cell
            cell_bw=bw_cell_m,  # backward cell
            inputs=long_word_embedding_lookup,  # 3 dim embedding input for rnn
            sequence_length= l_w_sequence_len,  # sequence len == batch_size

            dtype=tf.float32

        )

    transpose = tf.transpose(tf.concat(model, 2), [1, 0, 2])

    long_word_state_output = tf.concat([state_c[0].c, state_h[0].c], axis=-1)



    # Bi-directional lstm network
    with tf.variable_scope('encoder') as scope:
        model, (state_c, state_h) = tf.nn.bidirectional_dynamic_rnn(
            cell_fw=fr_cell_m,  # forward cell
            cell_bw=bw_cell_m,  # backward cell
            inputs=short_word_embedding_lookup,  # 3 dim embedding input for rnn
            sequence_length=s_w_sequence_len,  # sequence len == batch_size


            dtype=tf.float32

        )

    transpose = tf.transpose(tf.concat(model, 2), [1, 0, 2])

    short_word_state_output = tf.concat([state_c[0].c, state_h[0].c], axis=-1)



    with tf.variable_scope('encoder') as scope:
        model, (state_c, state_h) = tf.nn.bidirectional_dynamic_rnn(
            cell_fw=fr_cell_m,  # forward cell
            cell_bw=bw_cell_m,  # backward cell
            inputs=long_char_embedding_lookup,  # 3 dim embedding input for rnn
            sequence_length=l_c_sequence_len,  # sequence len == batch_size

            dtype=tf.float32

        )

    transpose = tf.transpose(tf.concat(model, 2), [1, 0, 2])

    long_char_state_output = tf.concat([state_c[0].c, state_h[0].c], axis=-1)



    with tf.variable_scope('encoder') as scope:
        model, (state_c, state_h) = tf.nn.bidirectional_dynamic_rnn(
            cell_fw=fr_cell_m,  # forward cell
            cell_bw=bw_cell_m,  # backward cell
            inputs=short_char_embedding_lookup,  # 3 dim embedding input for rnn
            sequence_length=s_c_sequence_len,  # sequence len == batch_size

            dtype=tf.float32

        )

    transpose = tf.transpose(tf.concat(model, 2), [1, 0, 2])

    short_char_state_output = tf.concat([state_c[0].c, state_h[0].c], axis=-1)

Как вы можете видеть, я использую тот же name_scope ('encode') дляИстм и все четыре рнн.

Я был бы очень признателен, если бы кто-нибудь любезно дал мне несколько советов о том, правильный ли это подход или что я должен изменить, если все мои четыре входных значения отличаются, и я собираюсь суммировать наконец.

Заранее спасибо.

...