code: def create_recurrent_encoder(input_state, memory_in, sequence_length, name='lstm'):
          
          s_size = input_state.get_shape().as_list()[1]
          m_size = memory_in.get_shape().as_list()[1]
          lstm_input_state = tf.reshape(input_state, shape=[-1, sequence_length, s_size])
          memory_in = tf.reshape(memory_in[:, :], [-1, m_size])
          _half_point = int(m_size / 2)
          with tf.variable_scope(name):
              rnn_cell = tf.contrib.rnn.BasicLSTMCell(_half_point)
              lstm_vector_in = tf.contrib.rnn.LSTMStateTuple(memory_in[:, :_half_point],
                                                             memory_in[:, _half_point:])
              recurrent_output, lstm_state_out = tf.nn.dynamic_rnn(rnn_cell, lstm_input_state,
                                                                   initial_state=lstm_vector_in)
  
          recurrent_output = tf.reshape(recurrent_output, shape=[-1, _half_point])
          return recurrent_output, tf.concat([lstm_state_out.c, lstm_state_out.h], axis=1)
docs: Builds a recurrent encoder for either state or observations (LSTM).
          :param sequence_length: Length of sequence to unroll.
          :param input_state: The input tensor to the LSTM cell.
          :param memory_in: The input memory to the LSTM cell.
          :param name: The scope of the LSTM cell.