一.前言

为了简化描述,后续均使用t2t来代替tensor2tensor。比起pytorch这类通用型框架,tensor2tensor其实文档写的并不算很清晰,因此有些部分需要回到代码中,看注释,看代码逻辑来理解。幸运的是tensor2tensor的架构还是很清晰的,因此有必要写点东西以做记录。

二.源码结构

进入tensor2tensor的根目录,首先要去的是bin目录,所有能够在命令行中看到的命令,都可以在该目录文件夹下看到。个人常用的是t2t_datagen, t2t_trainer, t2t_decoder, t2t_avg_all,其余的包括:t2t_distill, t2t_prune,t2t_bleu, t2t_attack等应该在对应场景下用途很广。其中,t2t_prune的代码中注释道:

This supports a very common form of pruning known as magnitude-based pruning.
It ranks individual weights or units according to their magnitudes and zeros
out the smallest k% of weights, effectively removing them from the graph.


这样对t2t可以做什么就有了一个基本的认识了,接下来当然要去数据层了,来到data_generator目录下。t2t中对于数据的处理定义为‘problem’,因此当我们需要处理自己的数据时,通常需要写一个problem类。t2t的发展很快,相比于去年,problem已经积累了很多,这里可以查看所有的problem。但是t2t可以处理的数据模态还是文本,声音,图片等。这个模块的架构还是非常清晰的,后续有需要处理多种数据的情形可以参照这块的代码逻辑。

有了数据,之后就需要选择模型了,这个时候可以直接来到models文件夹中了。依据处理模态的不同,依然有不同的模型实现,包括lstm/transformer/resnet/gan等。在实现模型的时候,必然需要对layer进行封装,因此可以到layers目录下查看各种layer的实现。有一类模型相对特殊,也就是增强学习,因此相关实现放在了rl单独一个目录中。

有了数据,有了模型,可以开始训练了。来到utils目录中,这里包含了metric逻辑,训练逻辑,优化逻辑等,这些模块对于不同的problem都是相同的,因此在t2t的封装中,将这些模块都封装成了工具类。

调试transformer模型的一个flask前端,在单独的一个insights目录中,一般情况下在部署模型之前,会做一个本地前端进行测试,这样自己就不需要搭前端了。与之相关的是visualization和serving两个模块,分别对应attention的可视化和模型部署。

最后,mesh_tensorflow放置了一些关于分布式应用的例子。

三.重点参数

t2t通过命令行的方式给出了我们一个指定参数的机会,同时tensortensor2tensor/tensor2tensor/layers/common_hparams.py中存放了默认参数。

1.batch_size

对于t2t_trainer来说,也就是在模型训练时候的batch_size,代码中有注释如下:

 # If the problem consists of variable-length sequences
      # (see problem.batch_size_means_tokens()), then this is the number
      # of tokens per batch per GPU or per TPU core.  Otherwise, this is
      # the number of examples per GPU or per TPU core.
      batch_size=4096,

也就是说默认的batch_size根据条件的不同,可以表示两种含义。

第一:如果指定了problem.batch_size_means_tokens()=True,则表示每个gpu的每个batch处理的tokens;实际上,通过读源代码可以知道,这也是t2t支持且默认的设置。

第二:如果不指定上述参数,则表示每个gpu处理的examples;其实这种情况是我们所熟悉的一种场景,在等长序列场景下,使用起来就比较顺畅了。但是如果可变长度序列场景下,这种情形对应了多数场景下的nlp问题,为了提升处理效率,第一种方式可能更加合适一些。

从自己之前的经验来看,该参数影响的是gpu利用的效率,对最终结果的影响不是决定性的。但是有必要对t2t中基于token的batch机制进一步理解。

不过batch_size这个参数不仅在trainer中出现,同样在decoder中出现。看代码如下(该代码出现在utils/trainer_lib.py中):

def create_estimator(model_name,
                     hparams,
                     run_config,
                     schedule="train_and_evaluate",
                     decode_hparams=None,
                     use_tpu=False,
                     use_tpu_estimator=False,
                     use_xla=False):
  """Create a T2T Estimator."""
  model_fn = t2t_model.T2TModel.make_estimator_model_fn(
      model_name, hparams, decode_hparams=decode_hparams)

  del use_xla
  if use_tpu or use_tpu_estimator:
    problem = hparams.problem
    batch_size = (
        problem.tpu_batch_size_per_shard(hparams) *
        run_config.tpu_config.num_shards)
    if getattr(hparams, "mtf_mode", False):
      batch_size = problem.tpu_batch_size_per_shard(hparams)
    predict_batch_size = batch_size
    if decode_hparams and decode_hparams.batch_size:
      predict_batch_size = decode_hparams.batch_size
    estimator = tf.contrib.tpu.TPUEstimator(
        model_fn=model_fn,
        model_dir=run_config.model_dir,
        config=run_config,
        use_tpu=use_tpu,
        train_batch_size=batch_size,
        eval_batch_size=batch_size if "eval" in schedule else None,
        predict_batch_size=predict_batch_size)
  else:
    estimator = tf.estimator.Estimator(
        model_fn=model_fn,
        model_dir=run_config.model_dir,
        config=run_config,
    )
  return estimator

由此推测,对于eval来说,train和eval的batch_size的含义相同,但是对于decode阶段来说,对应的batch_size应该就是样本个数。

2.max_subtoken_length

在tensor2tensor/data_generators/text_problems.py中,关于该参数的代码如下:

@property
  def max_subtoken_length(self):
    """Maximum subtoken length when generating vocab.
    SubwordTextEncoder vocabulary building is quadratic-time wrt this variable,
    setting it to None uses the length of the longest token in the corpus.
    Returns:
      an integer or None
    """
    return 200

tensor2tensor默认使用subword方式来做tokenization,那么这里面就会遇到最长token的问题,如果将该参数设置为None,则表示使用最长的token;但是如果设定为一个值,则表示最长的token就是该值。关于该参数还没有来得及去读代码,该参数是作用于vocab构建过程中,还是构建之后的后处理操作,不过单纯从注释来看,是前者。放在纠错任务中,我目前的该值设定为10,虽然默认值是200,但是结合自己的场景,其实还是过长的。

3.clip_grad_norm

tensortensor2tensor/tensor2tensor/layers/common_hparams.py中存放了该参数值,默认值为2.0。

4.max_length

 	# During training, we drop sequences whose inputs or targets are longer
      # than max_length.
      # If max_length==0, we use hparams.batch_size instead.
      max_length=0,
      # Maximum length in the smallest length bucket.  Setting this
      # flag too high will result in wasteful padding of short
      # sequences.  Due to some (hopefully) temporary hacks in the
      # data reading and batching code, setting this flag too low
      # results in a very long batch-shuffling queue.

四.重要文章

《Training Tips for the Transformer Model》,阅读笔记这里

附录(tensor2tensor 1.9.0的源码结构)

.
├── bin
│   ├── build_vocab.py
│   ├── __init__.py
│   ├── make_tf_configs.py
│   ├── __pycache__
│   │   ├── build_vocab.cpython-36.pyc
│   │   ├── __init__.cpython-36.pyc
│   │   ├── make_tf_configs.cpython-36.pyc
│   │   ├── t2t_attack.cpython-36.pyc
│   │   ├── t2t_avg_all.cpython-36.pyc
│   │   ├── t2t_bleu.cpython-36.pyc
│   │   ├── t2t_datagen.cpython-36.pyc
│   │   ├── t2t_decoder.cpython-36.pyc
│   │   ├── t2t_distill.cpython-36.pyc
│   │   ├── t2t_prune.cpython-36.pyc
│   │   ├── t2t_trainer.cpython-36.pyc
│   │   ├── t2t_trainer_test.cpython-36.pyc
│   │   └── t2t_translate_all.cpython-36.pyc
│   ├── t2t_attack.py
│   ├── t2t_avg_all.py
│   ├── t2t_bleu.py
│   ├── t2t_datagen.py
│   ├── t2t_decoder.py
│   ├── t2t_distill.py
│   ├── t2t_prune.py
│   ├── t2t_trainer.py
│   ├── t2t_trainer_test.py
│   └── t2t_translate_all.py
├── data_generators
│   ├── algorithmic_math.py
│   ├── algorithmic_math_test.py
│   ├── algorithmic.py
│   ├── algorithmic_test.py
│   ├── allen_brain.py
│   ├── allen_brain_test.py
│   ├── all_problems.py
│   ├── audio_encoder.py
│   ├── audio.py
│   ├── audio_test.py
│   ├── babi_qa.py
│   ├── bair_robot_pushing.py
│   ├── celebahq.py
│   ├── celeba.py
│   ├── celeba_test.py
│   ├── cifar.py
│   ├── cipher.py
│   ├── cnn_dailymail.py
│   ├── cola.py
│   ├── common_voice.py
│   ├── common_voice_test.py
│   ├── desc2code.py
│   ├── desc2code_test.py
│   ├── dna_encoder.py
│   ├── dna_encoder_test.py
│   ├── fsns.py
│   ├── function_docstring.py
│   ├── gene_expression.py
│   ├── gene_expression_test.py
│   ├── generator_utils.py
│   ├── generator_utils_test.py
│   ├── google_robot_pushing.py
│   ├── gym_problems.py
│   ├── gym_problems_specs.py
│   ├── gym_problems_test.py
│   ├── gym_utils.py
│   ├── ice_parsing.py
│   ├── image_lsun.py
│   ├── imagenet.py
│   ├── imagenet_test.py
│   ├── image_utils.py
│   ├── image_utils_test.py
│   ├── imdb.py
│   ├── __init__.py
│   ├── inspect_tfrecord.py
│   ├── lambada.py
│   ├── librispeech.py
│   ├── lm1b_imdb.py
│   ├── lm1b_mnli.py
│   ├── lm1b.py
│   ├── mnist.py
│   ├── mrpc.py
│   ├── mscoco.py
│   ├── mscoco_test.py
│   ├── multinli.py
│   ├── multi_problem.py
│   ├── ocr.py
│   ├── paraphrase_ms_coco.py
│   ├── paraphrase_ms_coco_test.py
│   ├── pointer_generator_word.py
│   ├── problem_hparams.py
│   ├── problem.py
│   ├── problem_test.py
│   ├── program_search.py
│   ├── program_search_test.py
│   ├── ptb.py
│   ├── __pycache__
│   │   ├── algorithmic.cpython-36.pyc
│   │   ├── algorithmic_math.cpython-36.pyc
│   │   ├── algorithmic_math_test.cpython-36.pyc
│   │   ├── algorithmic_test.cpython-36.pyc
│   │   ├── allen_brain.cpython-36.pyc
│   │   ├── allen_brain_test.cpython-36.pyc
│   │   ├── all_problems.cpython-36.pyc
│   │   ├── audio.cpython-36.pyc
│   │   ├── audio_encoder.cpython-36.pyc
│   │   ├── audio_test.cpython-36.pyc
│   │   ├── babi_qa.cpython-36.pyc
│   │   ├── bair_robot_pushing.cpython-36.pyc
│   │   ├── celeba.cpython-36.pyc
│   │   ├── celebahq.cpython-36.pyc
│   │   ├── celeba_test.cpython-36.pyc
│   │   ├── cifar.cpython-36.pyc
│   │   ├── cipher.cpython-36.pyc
│   │   ├── cnn_dailymail.cpython-36.pyc
│   │   ├── cola.cpython-36.pyc
│   │   ├── common_voice.cpython-36.pyc
│   │   ├── common_voice_test.cpython-36.pyc
│   │   ├── desc2code.cpython-36.pyc
│   │   ├── desc2code_test.cpython-36.pyc
│   │   ├── dna_encoder.cpython-36.pyc
│   │   ├── dna_encoder_test.cpython-36.pyc
│   │   ├── fsns.cpython-36.pyc
│   │   ├── function_docstring.cpython-36.pyc
│   │   ├── gene_expression.cpython-36.pyc
│   │   ├── gene_expression_test.cpython-36.pyc
│   │   ├── generator_utils.cpython-36.pyc
│   │   ├── generator_utils_test.cpython-36.pyc
│   │   ├── google_robot_pushing.cpython-36.pyc
│   │   ├── gym_problems.cpython-36.pyc
│   │   ├── gym_problems_specs.cpython-36.pyc
│   │   ├── gym_problems_test.cpython-36.pyc
│   │   ├── gym_utils.cpython-36.pyc
│   │   ├── ice_parsing.cpython-36.pyc
│   │   ├── image_lsun.cpython-36.pyc
│   │   ├── imagenet.cpython-36.pyc
│   │   ├── imagenet_test.cpython-36.pyc
│   │   ├── image_utils.cpython-36.pyc
│   │   ├── image_utils_test.cpython-36.pyc
│   │   ├── imdb.cpython-36.pyc
│   │   ├── __init__.cpython-36.pyc
│   │   ├── inspect_tfrecord.cpython-36.pyc
│   │   ├── lambada.cpython-36.pyc
│   │   ├── librispeech.cpython-36.pyc
│   │   ├── lm1b.cpython-36.pyc
│   │   ├── lm1b_imdb.cpython-36.pyc
│   │   ├── lm1b_mnli.cpython-36.pyc
│   │   ├── mnist.cpython-36.pyc
│   │   ├── mrpc.cpython-36.pyc
│   │   ├── mscoco.cpython-36.pyc
│   │   ├── mscoco_test.cpython-36.pyc
│   │   ├── multinli.cpython-36.pyc
│   │   ├── multi_problem.cpython-36.pyc
│   │   ├── ocr.cpython-36.pyc
│   │   ├── paraphrase_ms_coco.cpython-36.pyc
│   │   ├── paraphrase_ms_coco_test.cpython-36.pyc
│   │   ├── pointer_generator_word.cpython-36.pyc
│   │   ├── problem.cpython-36.pyc
│   │   ├── problem_hparams.cpython-36.pyc
│   │   ├── problem_test.cpython-36.pyc
│   │   ├── program_search.cpython-36.pyc
│   │   ├── program_search_test.cpython-36.pyc
│   │   ├── ptb.cpython-36.pyc
│   │   ├── qnli.cpython-36.pyc
│   │   ├── quora_qpairs.cpython-36.pyc
│   │   ├── rte.cpython-36.pyc
│   │   ├── snli.cpython-36.pyc
│   │   ├── speech_recognition.cpython-36.pyc
│   │   ├── squad.cpython-36.pyc
│   │   ├── sst_binary.cpython-36.pyc
│   │   ├── stanford_nli.cpython-36.pyc
│   │   ├── style_transfer.cpython-36.pyc
│   │   ├── style_transfer_test.cpython-36.pyc
│   │   ├── subject_verb_agreement.cpython-36.pyc
│   │   ├── text_encoder_build_subword.cpython-36.pyc
│   │   ├── text_encoder.cpython-36.pyc
│   │   ├── text_encoder_test.cpython-36.pyc
│   │   ├── text_problems.cpython-36.pyc
│   │   ├── text_problems_test.cpython-36.pyc
│   │   ├── timeseries.cpython-36.pyc
│   │   ├── timeseries_data_generator.cpython-36.pyc
│   │   ├── timeseries_data_generator_test.cpython-36.pyc
│   │   ├── timeseries_test.cpython-36.pyc
│   │   ├── tokenizer.cpython-36.pyc
│   │   ├── tokenizer_test.cpython-36.pyc
│   │   ├── translate.cpython-36.pyc
│   │   ├── translate_encs.cpython-36.pyc
│   │   ├── translate_ende.cpython-36.pyc
│   │   ├── translate_enet.cpython-36.pyc
│   │   ├── translate_enfr.cpython-36.pyc
│   │   ├── translate_enid.cpython-36.pyc
│   │   ├── translate_enmk.cpython-36.pyc
│   │   ├── translate_envi.cpython-36.pyc
│   │   ├── translate_enzh.cpython-36.pyc
│   │   ├── translate_test.cpython-36.pyc
│   │   ├── twentybn.cpython-36.pyc
│   │   ├── video_generated.cpython-36.pyc
│   │   ├── video_utils.cpython-36.pyc
│   │   ├── vqa.cpython-36.pyc
│   │   ├── vqa_utils.cpython-36.pyc
│   │   ├── wiki.cpython-36.pyc
│   │   ├── wikitext103.cpython-36.pyc
│   │   ├── wnli.cpython-36.pyc
│   │   └── wsj_parsing.cpython-36.pyc
│   ├── qnli.py
│   ├── quora_qpairs.py
│   ├── rte.py
│   ├── snli.py
│   ├── speech_recognition.py
│   ├── squad.py
│   ├── sst_binary.py
│   ├── stanford_nli.py
│   ├── style_transfer.py
│   ├── style_transfer_test.py
│   ├── subject_verb_agreement.py
│   ├── test_data
│   │   ├── 1.csv
│   │   ├── corpus-1.txt
│   │   ├── corpus-2.txt
│   │   ├── vocab-1.txt
│   │   └── vocab-2.txt
│   ├── text_encoder_build_subword.py
│   ├── text_encoder.py
│   ├── text_encoder_test.py
│   ├── text_problems.py
│   ├── text_problems_test.py
│   ├── timeseries_data_generator.py
│   ├── timeseries_data_generator_test.py
│   ├── timeseries.py
│   ├── timeseries_test.py
│   ├── tokenizer.py
│   ├── tokenizer_test.py
│   ├── translate_encs.py
│   ├── translate_ende.py
│   ├── translate_enet.py
│   ├── translate_enfr.py
│   ├── translate_enid.py
│   ├── translate_enmk.py
│   ├── translate_envi.py
│   ├── translate_enzh.py
│   ├── translate.py
│   ├── translate_test.py
│   ├── twentybn.py
│   ├── video_generated.py
│   ├── video_utils.py
│   ├── vqa.py
│   ├── vqa_utils.py
│   ├── wiki.py
│   ├── wikisum
│   │   ├── generate_vocab.py
│   │   ├── get_references_commoncrawl.py
│   │   ├── get_references_web.py
│   │   ├── get_references_web_single_group.py
│   │   ├── html.py
│   │   ├── __init__.py
│   │   ├── parallel_launch.py
│   │   ├── produce_examples.py
│   │   ├── __pycache__
│   │   │   ├── generate_vocab.cpython-36.pyc
│   │   │   ├── get_references_commoncrawl.cpython-36.pyc
│   │   │   ├── get_references_web.cpython-36.pyc
│   │   │   ├── get_references_web_single_group.cpython-36.pyc
│   │   │   ├── html.cpython-36.pyc
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   ├── parallel_launch.cpython-36.pyc
│   │   │   ├── produce_examples.cpython-36.pyc
│   │   │   ├── utils.cpython-36.pyc
│   │   │   ├── utils_test.cpython-36.pyc
│   │   │   ├── validate_data.cpython-36.pyc
│   │   │   └── wikisum.cpython-36.pyc
│   │   ├── test_data
│   │   │   ├── para_bad1.txt
│   │   │   └── para_good1.txt
│   │   ├── utils.py
│   │   ├── utils_test.py
│   │   ├── validate_data.py
│   │   └── wikisum.py
│   ├── wikitext103.py
│   ├── wnli.py
│   └── wsj_parsing.py
├── __init__.py
├── insights
│   ├── graph.py
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── graph.cpython-36.pyc
│   │   ├── __init__.cpython-36.pyc
│   │   ├── query_processor.cpython-36.pyc
│   │   ├── server.cpython-36.pyc
│   │   └── transformer_model.cpython-36.pyc
│   ├── query_processor.py
│   ├── server.py
│   └── transformer_model.py
├── layers
│   ├── common_attention.py
│   ├── common_attention_test.py
│   ├── common_hparams.py
│   ├── common_image_attention.py
│   ├── common_image_attention_test.py
│   ├── common_layers.py
│   ├── common_layers_test.py
│   ├── common_message_passing_attention.py
│   ├── common_video.py
│   ├── common_video_test.py
│   ├── discretization.py
│   ├── discretization_test.py
│   ├── __init__.py
│   ├── latent_layers.py
│   ├── modalities.py
│   ├── modalities_test.py
│   ├── __pycache__
│   │   ├── common_attention.cpython-36.pyc
│   │   ├── common_attention_test.cpython-36.pyc
│   │   ├── common_hparams.cpython-36.pyc
│   │   ├── common_image_attention.cpython-36.pyc
│   │   ├── common_image_attention_test.cpython-36.pyc
│   │   ├── common_layers.cpython-36.pyc
│   │   ├── common_layers_test.cpython-36.pyc
│   │   ├── common_message_passing_attention.cpython-36.pyc
│   │   ├── common_video.cpython-36.pyc
│   │   ├── common_video_test.cpython-36.pyc
│   │   ├── discretization.cpython-36.pyc
│   │   ├── discretization_test.cpython-36.pyc
│   │   ├── __init__.cpython-36.pyc
│   │   ├── latent_layers.cpython-36.pyc
│   │   ├── modalities.cpython-36.pyc
│   │   ├── modalities_test.cpython-36.pyc
│   │   ├── vqa_layers.cpython-36.pyc
│   │   └── vq_discrete.cpython-36.pyc
│   ├── vqa_layers.py
│   └── vq_discrete.py
├── mesh_tensorflow
│   ├── __init__.py
│   ├── mesh_tensorflow.py
│   ├── mesh_tensorflow_test.py
│   ├── mnist_dataset.py
│   ├── mnist.py
│   ├── mtf_beam_search.py
│   ├── mtf_image_transformer.py
│   ├── mtf_image_transformer_test.py
│   ├── mtf_layers.py
│   ├── mtf_layers_test.py
│   ├── mtf_model.py
│   ├── mtf_optimize.py
│   ├── mtf_toy_model_tpu.py
│   ├── mtf_transformer.py
│   ├── mtf_transformer_test.py
│   ├── mtf_utils.py
│   ├── placement_mesh_impl.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── mesh_tensorflow.cpython-36.pyc
│   │   ├── mesh_tensorflow_test.cpython-36.pyc
│   │   ├── mnist.cpython-36.pyc
│   │   ├── mnist_dataset.cpython-36.pyc
│   │   ├── mtf_beam_search.cpython-36.pyc
│   │   ├── mtf_image_transformer.cpython-36.pyc
│   │   ├── mtf_image_transformer_test.cpython-36.pyc
│   │   ├── mtf_layers.cpython-36.pyc
│   │   ├── mtf_layers_test.cpython-36.pyc
│   │   ├── mtf_model.cpython-36.pyc
│   │   ├── mtf_optimize.cpython-36.pyc
│   │   ├── mtf_toy_model_tpu.cpython-36.pyc
│   │   ├── mtf_transformer.cpython-36.pyc
│   │   ├── mtf_transformer_test.cpython-36.pyc
│   │   ├── mtf_utils.cpython-36.pyc
│   │   ├── placement_mesh_impl.cpython-36.pyc
│   │   ├── simd_mesh_impl.cpython-36.pyc
│   │   └── tpu_variables.cpython-36.pyc
│   ├── research
│   │   ├── experiments_moe.py
│   │   ├── __init__.py
│   │   ├── moe.py
│   │   └── __pycache__
│   │       ├── experiments_moe.cpython-36.pyc
│   │       ├── __init__.cpython-36.pyc
│   │       └── moe.cpython-36.pyc
│   ├── simd_mesh_impl.py
│   └── tpu_variables.py
├── models
│   ├── basic.py
│   ├── basic_test.py
│   ├── bytenet.py
│   ├── bytenet_test.py
│   ├── distillation.py
│   ├── image_transformer_2d.py
│   ├── image_transformer_2d_test.py
│   ├── image_transformer.py
│   ├── image_transformer_test.py
│   ├── __init__.py
│   ├── lstm.py
│   ├── lstm_test.py
│   ├── neural_gpu.py
│   ├── neural_gpu_test.py
│   ├── __pycache__
│   │   ├── basic.cpython-36.pyc
│   │   ├── basic_test.cpython-36.pyc
│   │   ├── bytenet.cpython-36.pyc
│   │   ├── bytenet_test.cpython-36.pyc
│   │   ├── distillation.cpython-36.pyc
│   │   ├── image_transformer_2d.cpython-36.pyc
│   │   ├── image_transformer_2d_test.cpython-36.pyc
│   │   ├── image_transformer.cpython-36.pyc
│   │   ├── image_transformer_test.cpython-36.pyc
│   │   ├── __init__.cpython-36.pyc
│   │   ├── lstm.cpython-36.pyc
│   │   ├── lstm_test.cpython-36.pyc
│   │   ├── neural_gpu.cpython-36.pyc
│   │   ├── neural_gpu_test.cpython-36.pyc
│   │   ├── resnet.cpython-36.pyc
│   │   ├── resnet_test.cpython-36.pyc
│   │   ├── revnet.cpython-36.pyc
│   │   ├── revnet_test.cpython-36.pyc
│   │   ├── shake_shake.cpython-36.pyc
│   │   ├── slicenet.cpython-36.pyc
│   │   ├── slicenet_test.cpython-36.pyc
│   │   ├── transformer.cpython-36.pyc
│   │   ├── transformer_test.cpython-36.pyc
│   │   ├── vanilla_gan.cpython-36.pyc
│   │   ├── xception.cpython-36.pyc
│   │   └── xception_test.cpython-36.pyc
│   ├── research
│   │   ├── adafactor_experiments.py
│   │   ├── aligned.py
│   │   ├── attention_lm_moe.py
│   │   ├── attention_lm.py
│   │   ├── autoencoders.py
│   │   ├── autoencoders_test.py
│   │   ├── cycle_gan.py
│   │   ├── gene_expression.py
│   │   ├── gene_expression_test.py
│   │   ├── glow_ops.py
│   │   ├── glow_ops_test.py
│   │   ├── glow.py
│   │   ├── glow_test.py
│   │   ├── __init__.py
│   │   ├── lm_experiments.py
│   │   ├── multimodel.py
│   │   ├── multimodel_test.py
│   │   ├── __pycache__
│   │   │   ├── adafactor_experiments.cpython-36.pyc
│   │   │   ├── aligned.cpython-36.pyc
│   │   │   ├── attention_lm.cpython-36.pyc
│   │   │   ├── attention_lm_moe.cpython-36.pyc
│   │   │   ├── autoencoders.cpython-36.pyc
│   │   │   ├── autoencoders_test.cpython-36.pyc
│   │   │   ├── cycle_gan.cpython-36.pyc
│   │   │   ├── gene_expression.cpython-36.pyc
│   │   │   ├── gene_expression_test.cpython-36.pyc
│   │   │   ├── glow.cpython-36.pyc
│   │   │   ├── glow_ops.cpython-36.pyc
│   │   │   ├── glow_ops_test.cpython-36.pyc
│   │   │   ├── glow_test.cpython-36.pyc
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   ├── lm_experiments.cpython-36.pyc
│   │   │   ├── multimodel.cpython-36.pyc
│   │   │   ├── multimodel_test.cpython-36.pyc
│   │   │   ├── rl.cpython-36.pyc
│   │   │   ├── similarity_transformer.cpython-36.pyc
│   │   │   ├── super_lm.cpython-36.pyc
│   │   │   ├── transformer_aux.cpython-36.pyc
│   │   │   ├── transformer_aux_test.cpython-36.pyc
│   │   │   ├── transformer_moe.cpython-36.pyc
│   │   │   ├── transformer_nat.cpython-36.pyc
│   │   │   ├── transformer_revnet.cpython-36.pyc
│   │   │   ├── transformer_revnet_test.cpython-36.pyc
│   │   │   ├── transformer_sketch.cpython-36.pyc
│   │   │   ├── transformer_symshard.cpython-36.pyc
│   │   │   ├── transformer_vae.cpython-36.pyc
│   │   │   ├── transformer_vae_test.cpython-36.pyc
│   │   │   ├── universal_transformer.cpython-36.pyc
│   │   │   ├── universal_transformer_test.cpython-36.pyc
│   │   │   ├── universal_transformer_util.cpython-36.pyc
│   │   │   ├── vqa_attention.cpython-36.pyc
│   │   │   ├── vqa_attention_test.cpython-36.pyc
│   │   │   ├── vqa_recurrent_self_attention.cpython-36.pyc
│   │   │   └── vqa_self_attention.cpython-36.pyc
│   │   ├── rl.py
│   │   ├── similarity_transformer.py
│   │   ├── super_lm.py
│   │   ├── transformer_aux.py
│   │   ├── transformer_aux_test.py
│   │   ├── transformer_moe.py
│   │   ├── transformer_nat.py
│   │   ├── transformer_revnet.py
│   │   ├── transformer_revnet_test.py
│   │   ├── transformer_sketch.py
│   │   ├── transformer_symshard.py
│   │   ├── transformer_vae.py
│   │   ├── transformer_vae_test.py
│   │   ├── universal_transformer.py
│   │   ├── universal_transformer_test.py
│   │   ├── universal_transformer_util.py
│   │   ├── vqa_attention.py
│   │   ├── vqa_attention_test.py
│   │   ├── vqa_recurrent_self_attention.py
│   │   └── vqa_self_attention.py
│   ├── resnet.py
│   ├── resnet_test.py
│   ├── revnet.py
│   ├── revnet_test.py
│   ├── shake_shake.py
│   ├── slicenet.py
│   ├── slicenet_test.py
│   ├── transformer.py
│   ├── transformer_test.py
│   ├── vanilla_gan.py
│   ├── video
│   │   ├── base_test.py
│   │   ├── base_vae.py
│   │   ├── basic_deterministic_params.py
│   │   ├── basic_deterministic.py
│   │   ├── basic_stochastic.py
│   │   ├── emily.py
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── base_test.cpython-36.pyc
│   │   │   ├── base_vae.cpython-36.pyc
│   │   │   ├── basic_deterministic.cpython-36.pyc
│   │   │   ├── basic_deterministic_params.cpython-36.pyc
│   │   │   ├── basic_stochastic.cpython-36.pyc
│   │   │   ├── emily.cpython-36.pyc
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   ├── savp.cpython-36.pyc
│   │   │   ├── savp_params.cpython-36.pyc
│   │   │   ├── sv2p.cpython-36.pyc
│   │   │   └── sv2p_params.cpython-36.pyc
│   │   ├── savp_params.py
│   │   ├── savp.py
│   │   ├── sv2p_params.py
│   │   └── sv2p.py
│   ├── xception.py
│   └── xception_test.py
├── problems.py
├── problems_test.py
├── __pycache__
│   ├── __init__.cpython-36.pyc
│   ├── problems.cpython-36.pyc
│   └── problems_test.cpython-36.pyc
├── rl
│   ├── collect.py
│   ├── datagen_with_agent.py
│   ├── envs
│   │   ├── batch_env_factory.py
│   │   ├── batch_env.py
│   │   ├── in_graph_batch_env.py
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── batch_env.cpython-36.pyc
│   │   │   ├── batch_env_factory.cpython-36.pyc
│   │   │   ├── in_graph_batch_env.cpython-36.pyc
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   ├── py_func_batch_env.cpython-36.pyc
│   │   │   ├── simulated_batch_env.cpython-36.pyc
│   │   │   ├── tf_atari_wrappers.cpython-36.pyc
│   │   │   └── utils.cpython-36.pyc
│   │   ├── py_func_batch_env.py
│   │   ├── simulated_batch_env.py
│   │   ├── tf_atari_wrappers.py
│   │   └── utils.py
│   ├── __init__.py
│   ├── ppo.py
│   ├── __pycache__
│   │   ├── collect.cpython-36.pyc
│   │   ├── datagen_with_agent.cpython-36.pyc
│   │   ├── __init__.cpython-36.pyc
│   │   ├── ppo.cpython-36.pyc
│   │   ├── rl_trainer_lib.cpython-36.pyc
│   │   ├── rl_trainer_lib_test.cpython-36.pyc
│   │   ├── trainer_model_based.cpython-36.pyc
│   │   ├── trainer_model_based_stochastic_test.cpython-36.pyc
│   │   ├── trainer_model_based_sv2p_test.cpython-36.pyc
│   │   ├── trainer_model_based_test.cpython-36.pyc
│   │   └── trainer_model_free.cpython-36.pyc
│   ├── rl_trainer_lib.py
│   ├── rl_trainer_lib_test.py
│   ├── trainer_model_based.py
│   ├── trainer_model_based_stochastic_test.py
│   ├── trainer_model_based_sv2p_test.py
│   ├── trainer_model_based_test.py
│   └── trainer_model_free.py
├── serving
│   ├── export.py
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── export.cpython-36.pyc
│   │   ├── __init__.cpython-36.pyc
│   │   ├── query.cpython-36.pyc
│   │   └── serving_utils.cpython-36.pyc
│   ├── query.py
│   └── serving_utils.py
├── utils
│   ├── adafactor.py
│   ├── adv_attack_utils.py
│   ├── avg_checkpoints.py
│   ├── beam_search.py
│   ├── beam_search_test.py
│   ├── bleu_hook.py
│   ├── bleu_hook_test.py
│   ├── checkpoint_compatibility_test.py
│   ├── cloud_mlengine.py
│   ├── compute_video_metrics.py
│   ├── data_reader.py
│   ├── data_reader_test.py
│   ├── decoding.py
│   ├── devices.py
│   ├── diet.py
│   ├── diet_test.py
│   ├── expert_utils.py
│   ├── expert_utils_test.py
│   ├── flags.py
│   ├── get_rouge.py
│   ├── __init__.py
│   ├── learning_rate.py
│   ├── metrics_hook.py
│   ├── metrics_hook_test.py
│   ├── metrics.py
│   ├── metrics_test.py
│   ├── modality.py
│   ├── multistep_optimizer.py
│   ├── multistep_optimizer_test.py
│   ├── optimize.py
│   ├── pruning_utils.py
│   ├── __pycache__
│   │   ├── adafactor.cpython-36.pyc
│   │   ├── adv_attack_utils.cpython-36.pyc
│   │   ├── avg_checkpoints.cpython-36.pyc
│   │   ├── beam_search.cpython-36.pyc
│   │   ├── beam_search_test.cpython-36.pyc
│   │   ├── bleu_hook.cpython-36.pyc
│   │   ├── bleu_hook_test.cpython-36.pyc
│   │   ├── checkpoint_compatibility_test.cpython-36.pyc
│   │   ├── cloud_mlengine.cpython-36.pyc
│   │   ├── compute_video_metrics.cpython-36.pyc
│   │   ├── data_reader.cpython-36.pyc
│   │   ├── data_reader_test.cpython-36.pyc
│   │   ├── decoding.cpython-36.pyc
│   │   ├── devices.cpython-36.pyc
│   │   ├── diet.cpython-36.pyc
│   │   ├── diet_test.cpython-36.pyc
│   │   ├── expert_utils.cpython-36.pyc
│   │   ├── expert_utils_test.cpython-36.pyc
│   │   ├── flags.cpython-36.pyc
│   │   ├── get_rouge.cpython-36.pyc
│   │   ├── __init__.cpython-36.pyc
│   │   ├── learning_rate.cpython-36.pyc
│   │   ├── metrics.cpython-36.pyc
│   │   ├── metrics_hook.cpython-36.pyc
│   │   ├── metrics_hook_test.cpython-36.pyc
│   │   ├── metrics_test.cpython-36.pyc
│   │   ├── modality.cpython-36.pyc
│   │   ├── multistep_optimizer.cpython-36.pyc
│   │   ├── multistep_optimizer_test.cpython-36.pyc
│   │   ├── optimize.cpython-36.pyc
│   │   ├── pruning_utils.cpython-36.pyc
│   │   ├── quantization.cpython-36.pyc
│   │   ├── registry.cpython-36.pyc
│   │   ├── registry_test.cpython-36.pyc
│   │   ├── restore_hook.cpython-36.pyc
│   │   ├── rouge.cpython-36.pyc
│   │   ├── rouge_test.cpython-36.pyc
│   │   ├── t2t_model.cpython-36.pyc
│   │   ├── t2t_model_test.cpython-36.pyc
│   │   ├── trainer_lib.cpython-36.pyc
│   │   ├── trainer_lib_test.cpython-36.pyc
│   │   ├── update_ops_hook.cpython-36.pyc
│   │   ├── usr_dir.cpython-36.pyc
│   │   ├── video2gif.cpython-36.pyc
│   │   ├── video_metrics.cpython-36.pyc
│   │   ├── yellowfin.cpython-36.pyc
│   │   └── yellowfin_test.cpython-36.pyc
│   ├── quantization.py
│   ├── registry.py
│   ├── registry_test.py
│   ├── restore_hook.py
│   ├── rouge.py
│   ├── rouge_test.py
│   ├── t2t_model.py
│   ├── t2t_model_test.py
│   ├── trainer_lib.py
│   ├── trainer_lib_test.py
│   ├── update_ops_hook.py
│   ├── usr_dir.py
│   ├── video2gif.py
│   ├── video_metrics.py
│   ├── yellowfin.py
│   └── yellowfin_test.py
└── visualization
    ├── attention.js
    ├── attention.py
    ├── __init__.py
    ├── __pycache__
    │   ├── attention.cpython-36.pyc
    │   ├── __init__.cpython-36.pyc
    │   ├── visualization.cpython-36.pyc
    │   └── visualization_test.cpython-36.pyc
    ├── TransformerVisualization.ipynb
    ├── visualization.py
    └── visualization_test.py

33 directories, 665 files