code: def _train_and_eval_dataset_v1(problem_name, data_dir):
    
    assert not tf.executing_eagerly(), "tf.eager mode must be turned off."
    problem = t2t_problems.problem(problem_name)
    train_dataset = problem.dataset(tf.estimator.ModeKeys.TRAIN, data_dir)
    train_dataset = train_dataset.map(_select_features)
    eval_dataset = problem.dataset(tf.estimator.ModeKeys.EVAL, data_dir)
    eval_dataset = eval_dataset.map(_select_features)
    hparams = problem.get_hparams()
    # We take a few training examples to guess the shapes.
    input_shapes, target_shapes = [], []
    example_tensor = train_dataset.make_one_shot_iterator().get_next()
    sess = tf.Session()
    example1 = sess.run(example_tensor)
    example2 = sess.run(example_tensor)
    example3 = sess.run(example_tensor)
    # We use "inputs" as input except for purely auto-regressive tasks like
    # language models where "targets" are used as input_key.
    input_key = "inputs" if "inputs" in example1 else "targets"
    supervised_keys = ([input_key], ["targets"])
    for example in [example1, example2, example3]:
      input_shapes.append(list(example[input_key].shape))
      target_shapes.append(list(example["targets"].shape))
    input_vocab_size = hparams.vocab_size[input_key]
    target_vocab_size = hparams.vocab_size["targets"]
    input_info = _make_info(input_shapes, input_vocab_size)
    target_info = _make_info(target_shapes, target_vocab_size)
    info = {input_key: input_info, "targets": target_info}
    return train_dataset, eval_dataset, info, supervised_keys
docs: Return train and evaluation datasets, feature info and supervised keys.