code: def create_model(text_in, timesteps, phase):
    
    with pt.defaults_scope(activation_fn=tf.nn.relu, l2loss=0.00001):
      # The embedding lookup must be placed on a cpu.
      with tf.device('/cpu:0'):
        embedded = text_in.embedding_lookup(CHARS, [EMBEDDING_SIZE])
      # Because the sequence LSTM expects each timestep to be its own Tensor,
      # we need to cleave the sequence.
      # Below we can build a stacked 2 layer LSTM by just chaining them together.
      # You can stack as many layers as you want.
      lstm = (embedded
              .cleave_sequence(timesteps)
              .sequence_lstm(LOWER)
              .sequence_lstm(UPPER))
  
      # The classifier is much more efficient if it runs across the entire
      # dataset at once, so we want to squash (i.e. uncleave).
      # Note: if phase is test, dropout is a noop.
      return (lstm.squash_sequence()
              .dropout(keep_prob=0.8, phase=phase)
              .fully_connected(CHARS, activation_fn=None))
docs: Creates a 2 layer LSTM model with dropout.
  
    Args:
      text_in: The input text as ASCII ordinals in a Tensor.
      timesteps: The number of timesteps in the sequence.
      phase: Phase controls whether or not dropout is active.  In training mode
        we want to perform dropout, but in test we want to disable it.
    Returns:
      The logits.