How to use multilayered bidirectional LSTM in Tensorflow?

前端 未结 4 1878
囚心锁ツ
囚心锁ツ 2021-02-06 05:02

I want to know how to use multilayered bidirectional LSTM in Tensorflow.

I have already implemented the contents of bidirectional LSTM, but I wanna compare this model wi

4条回答
  •  佛祖请我去吃肉
    2021-02-06 05:44

    As @Taras pointed out, you can use:

    (1) tf.nn.bidirectional_dynamic_rnn()

    (2) tf.contrib.rnn.stack_bidirectional_dynamic_rnn().

    All previous answers only capture (1), so I give some details on (2), in particular since it usually outperforms (1). For an intuition about the different connectivities see here.

    Let's say you want to create a stack of 3 BLSTM layers, each with 64 nodes:

    num_layers = 3
    num_nodes = 64
    
    
    # Define LSTM cells
    enc_fw_cells = [LSTMCell(num_nodes)for layer in range(num_layers)]
    enc_bw_cells = [LSTMCell(num_nodes) for layer in range(num_layers)]
    
    # Connect LSTM cells bidirectionally and stack
    (all_states, fw_state, bw_state) = tf.contrib.rnn.stack_bidirectional_dynamic_rnn(
            cells_fw=enc_fw_cells, cells_bw=enc_bw_cells, inputs=input_embed, dtype=tf.float32)
    
    # Concatenate results
    for k in range(num_layers):
        if k == 0:
            con_c = tf.concat((fw_state[k].c, bw_state[k].c), 1)
            con_h = tf.concat((fw_state[k].h, bw_state[k].h), 1)
        else:
            con_c = tf.concat((con_c, fw_state[k].c, bw_state[k].c), 1)
            con_h = tf.concat((con_h, fw_state[k].h, bw_state[k].h), 1)
    
    output = tf.contrib.rnn.LSTMStateTuple(c=con_c, h=con_h)
    

    In this case, I use the final states of the stacked biRNN rather than the states at all timesteps (saved in all_states), since I was using an encoding decoding scheme, where the above code was only the encoder.

提交回复
热议问题