예제 #1
0
def infer(hparams):
    utils.log('Inferring ...')

    if hparams.word_char == 'word':
        word_embed, word_vocab = data_utils.get_embed_vocab(hparams.word_embed_file)
        data_utils.init_data('word', word_vocab, hparams.question_file, infer_file=hparams.infer_file, test=True)
    else:
        char_embed, char_vocab = data_utils.get_embed_vocab(hparams.char_embed_file)
        data_utils.init_data('char', char_vocab, hparams.question_file, infer_file=hparams.infer_file, test=True)
    

    infer_graph = tf.Graph()
    utils.log('Creating infer model ...')
    with infer_graph.as_default(), tf.container("infer"):
        infer_iterator = data_utils.get_iterator('infer', hparams.batch_size, shuffle=False)
        infer_model = Model(hparams, 
        word_embed if hparams.word_char == 'word' else char_embed,
        infer_iterator, tf.contrib.learn.ModeKeys.EVAL)

    config_proto = tf.ConfigProto()
    config_proto.gpu_options.allow_growth = True
    infer_sess = tf.Session(graph=infer_graph, config=config_proto)

    latest_ckpt = tf.train.latest_checkpoint(hparams.best_model_dir)
    assert latest_ckpt, 'No ckpt for eval'
    infer_model.saver.restore(infer_sess, latest_ckpt)
    utils.log('Model parameters restored from {}'.format(latest_ckpt))

    scores = []

    infer_sess.run(infer_iterator.initializer)

    while True:
        try:
            batch_scores = infer_model.infer(infer_sess)
            for score in batch_scores:
                scores.append(score[1])
        except tf.errors.OutOfRangeError:
            with open(hparams.output_file, 'w') as fout:
                fout.write('y_pre\n')
                for score in scores:
                    fout.write(str(score) + '\n')
            
            utils.log('Finish eval on test, result saved to {}'.format(
                hparams.output_file
            ))

            break

    utils.log('Done')
예제 #2
0
def predict_on_stocks(array: numpy.array, model_path: str, interval: str,
                      stock_path: str):
    scaler = StandardScaler()
    open_data, close_data = init_data(array)

    open_data, close_data = normalize_data(open_data, close_data, scaler)

    (x_train, y_train, x_test, y_test) = split_data(open_data, close_data)
    (x_train, y_train) = shuffle_data(x_train, y_train)

    (model, checkpoint_callback) = create_model(model_path)
    model.fit(x_train,
              y_train,
              validation_data=(x_test, y_test),
              batch_size=64,
              epochs=EPOCHS,
              callbacks=[checkpoint_callback])

    #test_model(model, x_test, y_test, scaler, interval) // uncomment this if you want to test the ai efficiency

    dump(scaler, f'{model_path}/std_scaler.bin', compress=True)
def initialize(sess):
    """Initialize data and model."""
    if FLAGS.jobid >= 0:
        data.log_filename = os.path.join(FLAGS.train_dir,
                                         "log%d" % FLAGS.jobid)
    data.print_out("NN ", newline=False)

    # Set random seed.
    seed = FLAGS.random_seed + max(0, FLAGS.jobid)
    tf.set_random_seed(seed)
    random.seed(seed)
    np.random.seed(seed)

    # Check data sizes.
    assert data.bins
    min_length = 3
    max_length = min(FLAGS.max_length, data.bins[-1])
    assert max_length + 1 > min_length
    while len(data.bins) > 1 and data.bins[-2] > max_length + EXTRA_EVAL:
        data.bins = data.bins[:-1]
    assert data.bins[0] > FLAGS.rx_step
    data.forward_max = max(FLAGS.forward_max, data.bins[-1])
    nclass = min(FLAGS.niclass, FLAGS.noclass)
    data_size = FLAGS.train_data_size if FLAGS.mode == 0 else 1000

    # Initialize data for each task.
    tasks = FLAGS.task.split("-")
    for t in tasks:
        for l in xrange(max_length + EXTRA_EVAL - 1):
            data.init_data(t, l, data_size, nclass)
        data.init_data(t, data.bins[-2], data_size, nclass)
        data.init_data(t, data.bins[-1], data_size, nclass)
        end_size = 4 * 1024 if FLAGS.mode > 0 else 1024
        data.init_data(t, data.forward_max, end_size, nclass)

    # Print out parameters.
    curriculum = FLAGS.curriculum_bound
    msg1 = ("layers %d kw %d h %d kh %d relax %d batch %d noise %.2f task %s" %
            (FLAGS.nconvs, FLAGS.kw, FLAGS.height, FLAGS.kh, FLAGS.rx_step,
             FLAGS.batch_size, FLAGS.grad_noise_scale, FLAGS.task))
    msg2 = "data %d %s" % (FLAGS.train_data_size, msg1)
    msg3 = (
        "cut %.2f pull %.3f lr %.2f iw %.2f cr %.2f nm %d d%.4f gn %.2f %s" %
        (FLAGS.cutoff, FLAGS.pull_incr, FLAGS.lr, FLAGS.init_weight,
         curriculum, FLAGS.nmaps, FLAGS.dropout, FLAGS.max_grad_norm, msg2))
    data.print_out(msg3)

    # Create checkpoint directory if it does not exist.
    checkpoint_dir = os.path.join(
        FLAGS.train_dir,
        "neural_gpu%s" % ("" if FLAGS.jobid < 0 else str(FLAGS.jobid)))
    if not gfile.IsDirectory(checkpoint_dir):
        data.print_out("Creating checkpoint directory %s." % checkpoint_dir)
        gfile.MkDir(checkpoint_dir)

    # Create model and initialize it.
    tf.get_variable_scope().set_initializer(
        tf.uniform_unit_scaling_initializer(factor=1.8 * FLAGS.init_weight))
    model = neural_gpu.NeuralGPU(FLAGS.nmaps, FLAGS.nmaps, FLAGS.niclass,
                                 FLAGS.noclass, FLAGS.dropout, FLAGS.rx_step,
                                 FLAGS.max_grad_norm, FLAGS.cutoff,
                                 FLAGS.nconvs, FLAGS.kw, FLAGS.kh,
                                 FLAGS.height, FLAGS.mode, FLAGS.lr,
                                 FLAGS.pull, FLAGS.pull_incr, min_length + 3)
    data.print_out("Created model.")
    sess.run(tf.initialize_all_variables())
    data.print_out("Initialized variables.")

    # Load model from parameters if a checkpoint exists.
    ckpt = tf.train.get_checkpoint_state(checkpoint_dir)
    if ckpt and gfile.Exists(ckpt.model_checkpoint_path):
        data.print_out("Reading model parameters from %s" %
                       ckpt.model_checkpoint_path)
        model.saver.restore(sess, ckpt.model_checkpoint_path)

    # Check if there are ensemble models and get their checkpoints.
    ensemble = []
    ensemble_dir_list = [d for d in FLAGS.ensemble.split(",") if d]
    for ensemble_dir in ensemble_dir_list:
        ckpt = tf.train.get_checkpoint_state(ensemble_dir)
        if ckpt and gfile.Exists(ckpt.model_checkpoint_path):
            data.print_out("Found ensemble model %s" %
                           ckpt.model_checkpoint_path)
            ensemble.append(ckpt.model_checkpoint_path)

    # Return the model and needed variables.
    return (model, min_length, max_length, checkpoint_dir, curriculum,
            ensemble)
예제 #4
0
def initialize(sess=None):
  """Initialize data and model."""
  global MAXLEN_F
  # Create training directory if it does not exist.
  if not tf.gfile.IsDirectory(FLAGS.train_dir):
    data.print_out("Creating training directory %s." % FLAGS.train_dir)
    tf.gfile.MkDir(FLAGS.train_dir)
  decode_suffix = "beam%dln%d" % (FLAGS.beam_size,
                                  int(100 * FLAGS.length_norm))
  if FLAGS.mode == 0:
    decode_suffix = ""
  if FLAGS.task >= 0:
    data.log_filename = os.path.join(FLAGS.train_dir,
                                     "log%d%s" % (FLAGS.task, decode_suffix))
  else:
    data.log_filename = os.path.join(FLAGS.train_dir, "neural_gpu/log")

  # Set random seed.
  if FLAGS.random_seed > 0:
    seed = FLAGS.random_seed + max(0, FLAGS.task)
    tf.set_random_seed(seed)
    random.seed(seed)
    np.random.seed(seed)

  # Check data sizes.
  assert data.bins
  max_length = min(FLAGS.max_length, data.bins[-1])
  while len(data.bins) > 1 and data.bins[-2] >= max_length + EXTRA_EVAL:
    data.bins = data.bins[:-1]
  if sess is None and FLAGS.task == 0 and FLAGS.num_replicas > 1:
    if max_length > 60:
      max_length = max_length * 1 / 2  # Save memory on chief.
  min_length = min(14, max_length - 3) if FLAGS.problem == "wmt" else 3
  for p in FLAGS.problem.split("-"):
    if p in ["progeval", "progsynth"]:
      min_length = max(26, min_length)
  assert max_length + 1 > min_length
  while len(data.bins) > 1 and data.bins[-2] >= max_length + EXTRA_EVAL:
    data.bins = data.bins[:-1]

  # Create checkpoint directory if it does not exist.
  if FLAGS.mode == 0 or FLAGS.task < 0:
    checkpoint_dir = os.path.join(FLAGS.train_dir, "neural_gpu%s"
                                  % ("" if FLAGS.task < 0 else str(FLAGS.task)))
  else:
    checkpoint_dir = FLAGS.train_dir
  if not tf.gfile.IsDirectory(checkpoint_dir):
    data.print_out("Creating checkpoint directory %s." % checkpoint_dir)
    tf.gfile.MkDir(checkpoint_dir)

  # Prepare data.
  if FLAGS.problem == "wmt":
    # Prepare WMT data.
    data.print_out("Preparing WMT data in %s" % FLAGS.data_dir)
    if FLAGS.simple_tokenizer:
      MAXLEN_F = 3.5
      (en_train, fr_train, en_dev, fr_dev,
       en_path, fr_path) = wmt.prepare_wmt_data(
           FLAGS.data_dir, FLAGS.vocab_size,
           tokenizer=wmt.space_tokenizer,
           normalize_digits=FLAGS.normalize_digits)
    else:
      (en_train, fr_train, en_dev, fr_dev,
       en_path, fr_path) = wmt.prepare_wmt_data(
           FLAGS.data_dir, FLAGS.vocab_size)

    # Read data into buckets and compute their sizes.
    fr_vocab, rev_fr_vocab = wmt.initialize_vocabulary(fr_path)
    data.vocab = fr_vocab
    data.rev_vocab = rev_fr_vocab
    data.print_out("Reading development and training data (limit: %d)."
                   % FLAGS.max_train_data_size)
    dev_set = {}
    dev_set["wmt"] = read_data(en_dev, fr_dev, data.bins)
    def data_read(size, print_out):
      read_data_into_global(en_train, fr_train, data.bins, size, print_out)
    data_read(50000, False)
    read_thread_small = threading.Thread(
        name="reading-data-small", target=lambda: data_read(900000, False))
    read_thread_small.start()
    read_thread_full = threading.Thread(
        name="reading-data-full",
        target=lambda: data_read(FLAGS.max_train_data_size, True))
    read_thread_full.start()
    data.print_out("Data reading set up.")
  else:
    # Prepare algorithmic data.
    en_path, fr_path = None, None
    tasks = FLAGS.problem.split("-")
    data_size = FLAGS.train_data_size
    for t in tasks:
      data.print_out("Generating data for %s." % t)
      if t in ["progeval", "progsynth"]:
        data.init_data(t, data.bins[-1], 20 * data_size, FLAGS.vocab_size)
        if len(program_utils.prog_vocab) > FLAGS.vocab_size - 2:
          raise ValueError("Increase vocab_size to %d for prog-tasks."
                           % (len(program_utils.prog_vocab) + 2))
        data.rev_vocab = program_utils.prog_vocab
        data.vocab = program_utils.prog_rev_vocab
      else:
        for l in xrange(max_length + EXTRA_EVAL - 1):
          data.init_data(t, l, data_size, FLAGS.vocab_size)
        data.init_data(t, data.bins[-2], data_size, FLAGS.vocab_size)
        data.init_data(t, data.bins[-1], data_size, FLAGS.vocab_size)
      if t not in global_train_set:
        global_train_set[t] = []
      global_train_set[t].append(data.train_set[t])
      calculate_buckets_scale(data.train_set[t], data.bins, t)
    dev_set = data.test_set

  # Grid-search parameters.
  lr = FLAGS.lr
  init_weight = FLAGS.init_weight
  max_grad_norm = FLAGS.max_grad_norm
  if sess is not None and FLAGS.task > -1:
    def job_id_factor(step):
      """If jobid / step mod 3 is 0, 1, 2: say 0, 1, -1."""
      return ((((FLAGS.task / step) % 3) + 1) % 3) - 1
    lr *= math.pow(2, job_id_factor(1))
    init_weight *= math.pow(1.5, job_id_factor(3))
    max_grad_norm *= math.pow(2, job_id_factor(9))

  # Print out parameters.
  curriculum = FLAGS.curriculum_seq
  msg1 = ("layers %d kw %d h %d kh %d batch %d noise %.2f"
          % (FLAGS.nconvs, FLAGS.kw, FLAGS.height, FLAGS.kh,
             FLAGS.batch_size, FLAGS.grad_noise_scale))
  msg2 = ("cut %.2f lr %.3f iw %.2f cr %.2f nm %d d%.4f gn %.2f %s"
          % (FLAGS.cutoff, lr, init_weight, curriculum, FLAGS.nmaps,
             FLAGS.dropout, max_grad_norm, msg1))
  data.print_out(msg2)

  # Create model and initialize it.
  tf.get_variable_scope().set_initializer(
      tf.orthogonal_initializer(gain=1.8 * init_weight))
  max_sampling_rate = FLAGS.max_sampling_rate if FLAGS.mode == 0 else 0.0
  o = FLAGS.vocab_size if FLAGS.max_target_vocab < 1 else FLAGS.max_target_vocab
  ngpu.CHOOSE_K = FLAGS.soft_mem_size
  do_beam_model = FLAGS.train_beam_freq > 0.0001 and FLAGS.beam_size > 1
  beam_size = FLAGS.beam_size if FLAGS.mode > 0 and not do_beam_model else 1
  beam_size = min(beam_size, FLAGS.beam_size)
  beam_model = None
  def make_ngpu(cur_beam_size, back):
    return ngpu.NeuralGPU(
        FLAGS.nmaps, FLAGS.vec_size, FLAGS.vocab_size, o,
        FLAGS.dropout, max_grad_norm, FLAGS.cutoff, FLAGS.nconvs,
        FLAGS.kw, FLAGS.kh, FLAGS.height, FLAGS.mem_size,
        lr / math.sqrt(FLAGS.num_replicas), min_length + 3, FLAGS.num_gpus,
        FLAGS.num_replicas, FLAGS.grad_noise_scale, max_sampling_rate,
        atrous=FLAGS.atrous, do_rnn=FLAGS.rnn_baseline,
        do_layer_norm=FLAGS.layer_norm, beam_size=cur_beam_size, backward=back)
  if sess is None:
    with tf.device(tf.train.replica_device_setter(FLAGS.ps_tasks)):
      model = make_ngpu(beam_size, True)
      if do_beam_model:
        tf.get_variable_scope().reuse_variables()
        beam_model = make_ngpu(FLAGS.beam_size, False)
  else:
    model = make_ngpu(beam_size, True)
    if do_beam_model:
      tf.get_variable_scope().reuse_variables()
      beam_model = make_ngpu(FLAGS.beam_size, False)

  sv = None
  if sess is None:
    # The supervisor configuration has a few overriden options.
    sv = tf.train.Supervisor(logdir=checkpoint_dir,
                             is_chief=(FLAGS.task < 1),
                             saver=model.saver,
                             summary_op=None,
                             save_summaries_secs=60,
                             save_model_secs=15 * 60,
                             global_step=model.global_step)

    config = tf.ConfigProto(allow_soft_placement=True)
    sess = sv.PrepareSession(FLAGS.master, config=config)

  data.print_out("Created model. Checkpoint dir %s" % checkpoint_dir)

  # Load model from parameters if a checkpoint exists.
  ckpt = tf.train.get_checkpoint_state(checkpoint_dir)
  if ckpt and tf.gfile.Exists(ckpt.model_checkpoint_path + ".index"):
    data.print_out("Reading model parameters from %s"
                   % ckpt.model_checkpoint_path)
    model.saver.restore(sess, ckpt.model_checkpoint_path)
  elif sv is None:
    sess.run(tf.global_variables_initializer())
    data.print_out("Initialized variables (no supervisor mode).")
  elif FLAGS.task < 1 and FLAGS.mem_size > 0:
    # sess.run(model.mem_norm_op)
    data.print_out("Created new model and normalized mem (on chief).")

  # Return the model and needed variables.
  return (model, beam_model, min_length, max_length, checkpoint_dir,
          (global_train_set, dev_set, en_path, fr_path), sv, sess)
예제 #5
0
def initialize(sess):
  """Initialize data and model."""
  if FLAGS.jobid >= 0:
    data.log_filename = os.path.join(FLAGS.train_dir, "log%d" % FLAGS.jobid)
  data.print_out("NN ", newline=False)

  # Set random seed.
  seed = FLAGS.random_seed + max(0, FLAGS.jobid)
  tf.set_random_seed(seed)
  random.seed(seed)
  np.random.seed(seed)

  # Check data sizes.
  assert data.bins
  min_length = 3
  max_length = min(FLAGS.max_length, data.bins[-1])
  assert max_length + 1 > min_length
  while len(data.bins) > 1 and data.bins[-2] > max_length + EXTRA_EVAL:
    data.bins = data.bins[:-1]
  assert data.bins[0] > FLAGS.rx_step
  data.forward_max = max(FLAGS.forward_max, data.bins[-1])
  nclass = min(FLAGS.niclass, FLAGS.noclass)
  data_size = FLAGS.train_data_size if FLAGS.mode == 0 else 1000

  # Initialize data for each task.
  tasks = FLAGS.task.split("-")
  for t in tasks:
    for l in xrange(max_length + EXTRA_EVAL - 1):
      data.init_data(t, l, data_size, nclass)
    data.init_data(t, data.bins[-2], data_size, nclass)
    data.init_data(t, data.bins[-1], data_size, nclass)
    end_size = 4 * 1024 if FLAGS.mode > 0 else 1024
    data.init_data(t, data.forward_max, end_size, nclass)

  # Print out parameters.
  curriculum = FLAGS.curriculum_bound
  msg1 = ("layers %d kw %d h %d kh %d relax %d batch %d noise %.2f task %s"
          % (FLAGS.nconvs, FLAGS.kw, FLAGS.height, FLAGS.kh, FLAGS.rx_step,
             FLAGS.batch_size, FLAGS.grad_noise_scale, FLAGS.task))
  msg2 = "data %d %s" % (FLAGS.train_data_size, msg1)
  msg3 = ("cut %.2f pull %.3f lr %.2f iw %.2f cr %.2f nm %d d%.4f gn %.2f %s" %
          (FLAGS.cutoff, FLAGS.pull_incr, FLAGS.lr, FLAGS.init_weight,
           curriculum, FLAGS.nmaps, FLAGS.dropout, FLAGS.max_grad_norm, msg2))
  data.print_out(msg3)

  # Create checkpoint directory if it does not exist.
  checkpoint_dir = os.path.join(FLAGS.train_dir, "neural_gpu%s"
                                % ("" if FLAGS.jobid < 0 else str(FLAGS.jobid)))
  if not gfile.IsDirectory(checkpoint_dir):
    data.print_out("Creating checkpoint directory %s." % checkpoint_dir)
    gfile.MkDir(checkpoint_dir)

  # Create model and initialize it.
  tf.get_variable_scope().set_initializer(
      tf.uniform_unit_scaling_initializer(factor=1.8 * FLAGS.init_weight))
  model = neural_gpu.NeuralGPU(
      FLAGS.nmaps, FLAGS.nmaps, FLAGS.niclass, FLAGS.noclass, FLAGS.dropout,
      FLAGS.rx_step, FLAGS.max_grad_norm, FLAGS.cutoff, FLAGS.nconvs,
      FLAGS.kw, FLAGS.kh, FLAGS.height, FLAGS.mode, FLAGS.lr,
      FLAGS.pull, FLAGS.pull_incr, min_length + 3)
  data.print_out("Created model.")
  sess.run(tf.initialize_all_variables())
  data.print_out("Initialized variables.")

  # Load model from parameters if a checkpoint exists.
  ckpt = tf.train.get_checkpoint_state(checkpoint_dir)
  if ckpt and gfile.Exists(ckpt.model_checkpoint_path):
    data.print_out("Reading model parameters from %s"
                   % ckpt.model_checkpoint_path)
    model.saver.restore(sess, ckpt.model_checkpoint_path)

  # Check if there are ensemble models and get their checkpoints.
  ensemble = []
  ensemble_dir_list = [d for d in FLAGS.ensemble.split(",") if d]
  for ensemble_dir in ensemble_dir_list:
    ckpt = tf.train.get_checkpoint_state(ensemble_dir)
    if ckpt and gfile.Exists(ckpt.model_checkpoint_path):
      data.print_out("Found ensemble model %s" % ckpt.model_checkpoint_path)
      ensemble.append(ckpt.model_checkpoint_path)

  # Return the model and needed variables.
  return (model, min_length, max_length, checkpoint_dir, curriculum, ensemble)
예제 #6
0
countList = [cnf.batch_size for x in cnf.bins]
np.set_printoptions(linewidth=2000, precision=4, suppress=True)

# prepare training and test data
max_length = cnf.bins[-1]
data_gen.init()

if cnf.task in cnf.language_tasks:
    task = data_gen.find_data_task(cnf.task)
    task.prepare_data()
    data_gen.collect_bins()
    data_gen.print_bin_usage()
else:
    for length in range(1, max_length + 1):
        n_examples = cnf.data_size
        data_gen.init_data(cnf.task, length, n_examples, cnf.n_input)
    data_gen.collect_bins()
    if len(data_gen.train_set[cnf.task][cnf.forward_max]) == 0:
        data_gen.init_data(cnf.task, cnf.forward_max, cnf.test_data_size, cnf.n_input)

data_supplier = data_feeder.create_data_supplier()


# Perform training
with tf.Graph().as_default():
    learner = RSE(cnf.n_hidden, cnf.bins, cnf.n_input, countList, cnf.n_output, cnf.dropout_keep_prob,
                  create_translation_model=cnf.task in cnf.language_tasks, use_two_gpus=cnf.use_two_gpus)
    learner.create_graph()
    learner.variable_summaries = tf.compat.v1.summary.merge_all()
    tf.compat.v1.get_variable_scope().reuse_variables()
    learner.create_test_graph(cnf.forward_max)
예제 #7
0
def train(hparams):
    utils.log('Training ...')

    model_dir = hparams.model_dir

    if hparams.word_char == 'word':
        word_embed, word_vocab = data_utils.get_embed_vocab(hparams.word_embed_file)
        data_utils.init_data('word', word_vocab, hparams.question_file, train_file=hparams.train_file, valid_file=hparams.valid_file)
    else:
        char_embed, char_vocab = data_utils.get_embed_vocab(hparams.char_embed_file)
        data_utils.init_data('char', char_vocab, hparams.question_file, train_file=hparams.train_file, valid_file=hparams.valid_file)
    

    train_graph = tf.Graph()
    utils.log('Creating train model ...')
    with train_graph.as_default(), tf.container("train"):
        train_iterator = data_utils.get_iterator('train', hparams.batch_size, shuffle=True)
        train_model = Model(hparams, 
            word_embed if hparams.word_char == 'word' else char_embed, 
            train_iterator, tf.contrib.learn.ModeKeys.TRAIN)

    eval_graph = tf.Graph()
    utils.log('Creating eval model ...')
    with eval_graph.as_default(), tf.container("eval"):
        eval_iterator = data_utils.get_iterator('valid', hparams.batch_size, shuffle=False)
        eval_model = Model(hparams,
        word_embed if hparams.word_char == 'word' else char_embed,
        eval_iterator, tf.contrib.learn.ModeKeys.EVAL)

    config_proto = tf.ConfigProto()
    config_proto.gpu_options.allow_growth = True
    train_sess = tf.Session(graph=train_graph, config=config_proto)
    eval_sess = tf.Session(graph=eval_graph, config=config_proto)

    log_every_n_batch = 10
    eval_every_n_batch = int(hparams.num_train_steps / hparams.epochs / 3)

    with train_graph.as_default(), tf.container("train"):
        train_sess.run(tf.global_variables_initializer())


    for epoch in range(1, hparams.epochs + 1):
        utils.log('Start epoch {}'.format(epoch))

        total_loss = 0
        total_num = 0
        batch_loss = 0

        train_sess.run(train_iterator.initializer)

        while True:
            try:
                global_step, batch_size, loss, _ = train_model.train(train_sess, hparams.lr)
            except tf.errors.OutOfRangeError:
                utils.log('Finish epoch {}, average train loss is {}'.format(
                    epoch, total_loss / total_num))

                break

            total_loss += loss * batch_size
            total_num += batch_size
            batch_loss += loss

            if global_step > 0 and global_step % log_every_n_batch == 0:
                utils.log('Average loss from batch {} to batch {} is loss {} with lr {}'.format(
                    global_step - log_every_n_batch + 1, global_step, 
                    batch_loss / log_every_n_batch, hparams.lr
                ))
                batch_loss = 0
            
            if global_step > 0 and global_step % eval_every_n_batch == 0:
                train_model.save(train_sess, model_dir, hparams.model_prefix)
                eval(hparams, eval_model, eval_sess, eval_iterator)

    utils.log('Done')