def biLSTM(f_lstm, b_lstm, inputs, batch_size=None, dropout_x=<NUM_LIT:0.>, dropout_h=<NUM_LIT:0.>):
for f, b in zip(f_lstm, b_lstm):<EOL><INDENT>inputs = nd.Dropout(inputs, dropout_x, axes=[<NUM_LIT:0>])  <EOL>fo, fs = f.unroll(length=inputs.shape[<NUM_LIT:0>], inputs=inputs, layout='<STR_LIT>', merge_outputs=True)<EOL>bo, bs = b.unroll(length=inputs.shape[<NUM_LIT:0>], inputs=inputs.flip(axis=<NUM_LIT:0>), layout='<STR_LIT>', merge_outputs=True)<EOL>f.reset(), b.reset()<EOL>inputs = nd.concat(fo, bo.flip(axis=<NUM_LIT:0>), dim=<NUM_LIT:2>)<EOL><DEDENT>return inputs<EOL>
Feature extraction through BiLSTM

    Parameters
    ----------
    f_lstm : VariationalDropoutCell
        Forward cell
    b_lstm : VariationalDropoutCell
        Backward cell
    inputs : NDArray
        seq_len x batch_size
    dropout_x : float
        Variational dropout on inputs
    dropout_h :
        Not used

    Returns
    -------
    outputs : NDArray
        Outputs of BiLSTM layers, seq_len x 2 hidden_dims x batch_size