docs: def sg_train(**kwargs):
      r"""Trains the model.
  
      Args:
        **kwargs:
          optim: A name for optimizer. 'MaxProp' (default), 'AdaMax', 'Adam', 'RMSProp' or 'sgd'.
          loss: A 0-D `Tensor` containing the value to minimize.
          lr: A Python Scalar (optional). Learning rate. Default is .001.
          beta1: A Python Scalar (optional). Default is .9.
          beta2: A Python Scalar (optional). Default is .99.
  
          save_dir: A string. The root path to which checkpoint and log files are saved.
            Default is `asset/train`.
          max_ep: A positive integer. Maximum number of epochs. Default is 1000.    
          ep_size: A positive integer. Number of Total batches in an epoch. 
            For proper display of log. Default is 1e5.    
  
          save_interval: A Python scalar. The interval of saving checkpoint files.
            By default, for every 600 seconds, a checkpoint file is written.
          log_interval: A Python scalar. The interval of recoding logs.
            By default, for every 60 seconds, logging is executed.
          max_keep: A positive integer. Maximum number of recent checkpoints to keep. Default is 5.
          keep_interval: A Python scalar. How often to keep checkpoints. Default is 1 hour.
  
          category: Scope name or list to train
  
          eval_metric: A list of tensors containing the value to evaluate. Default is [].
  
          tqdm: Boolean. If True (Default), progress bars are shown. If False, a series of loss
              will be shown on the console.
  
      """
      opt = tf.sg_opt(kwargs)
      assert opt.loss is not None, 'loss is mandatory.'
  
      # default training options
      opt += tf.sg_opt(optim='MaxProp', lr=0.001, beta1=0.9, beta2=0.99, category='', ep_size=100000)
  
      # get optimizer
      train_op = sg_optim(opt.loss, optim=opt.optim, lr=0.001,
                          beta1=opt.beta1, beta2=opt.beta2, category=opt.category)
  
      # for console logging
      loss_ = opt.loss
  
      # use only first loss when multiple GPU case
      if isinstance(opt.loss, (tuple, list)):
          loss_ = opt.loss[0]
  
      # define train function
      # noinspection PyUnusedLocal
      @sg_train_func
      def train_func(sess, arg):
          return sess.run([loss_, train_op])[0]
  
      # run train function
      train_func(**opt)