tf.initialize_all_variables().run()

    mean_time_per_epoch = 0
    start_time = time.time()
    print('\n' * 2)
    for epoch in range(conf.num_epochs):
        # additional variables to track the model
        losses = 0
        batch_index = 0

        # Model training
        current_learning_rate = conf.learning_rate * (conf.decay_rate**epoch)
        sess.run(tf.assign(train_model.learning_rate, current_learning_rate))
        state = train_model.initial_state.eval()
        for batch_x, batch_y in reader.generateXYPairs():
            # run_metadata = tf.RunMetadata()
            feed_dict = {
                train_model.input_x: batch_x,
                train_model.input_y: batch_y,
                train_model.initial_state: state,
            }
            summary, perplexity, cost_res, loss_res, state, _ = sess.run(
                [
                    train_model.merged, train_model.perplexity,
                    train_model.cost, train_model.loss,
                    train_model.final_state, train_model.train_operation
                ],
                feed_dict=feed_dict)
            losses += loss_res
            batch_index += 1