![No Maintenance Intended](https://img.shields.io/badge/No%20Maintenance%20Intended-%E2%9C%95-red.svg) ![TensorFlow Requirement: 1.x](https://img.shields.io/badge/TensorFlow%20Requirement-1.x-brightgreen) ![TensorFlow 2 Not Supported](https://img.shields.io/badge/TensorFlow%202%20Not%20Supported-%E2%9C%95-red.svg) # Real NVP in TensorFlow *A Tensorflow implementation of the training procedure of* [*Density estimation using Real NVP*](https://arxiv.org/abs/1605.08803)*, by Laurent Dinh, Jascha Sohl-Dickstein and Samy Bengio, for Imagenet (32x32 and 64x64), CelebA and LSUN Including the scripts to put the datasets in `.tfrecords` format.* We are happy to open source the code for *Real NVP*, a novel approach to density estimation using deep neural networks that enables tractable density estimation and efficient one-pass inference and sampling. This model successfully decomposes images into hierarchical features ranging from high-level concepts to low-resolution details. Visualizations are available [here](http://goo.gl/yco14s). ## Installation * python 2.7: * python 3 support is not available yet * pip (python package manager) * `apt-get install python-pip` on Ubuntu * `brew` installs pip along with python on OSX * Install the dependencies for [LSUN](https://github.com/fyu/lsun.git) * Install [OpenCV](http://opencv.org/) * `pip install numpy lmdb` * Install the python dependencies * `pip install scipy scikit-image Pillow` * Install the [latest Tensorflow Pip package](https://www.tensorflow.org/get_started/os_setup.html#using-pip) for Python 2.7 ## Getting Started Once you have successfully installed the dependencies, you can start by downloading the repository: ```shell git clone --recursive https://github.com/tensorflow/models.git ``` Afterward, you can use the utilities in this folder prepare the datasets. ## Preparing datasets ### CelebA For [*CelebA*](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html), download `img_align_celeba.zip` from the Dropbox link on this [page](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html) under the link *Align&Cropped Images* in the *Img* directory and `list_eval_partition.txt` under the link *Train/Val/Test Partitions* in the *Eval* directory. Then do: ```shell mkdir celeba cd celeba unzip img_align_celeba.zip ``` We'll format the training subset: ```shell python2.7 ../models/real_nvp/celeba_formatting.py \ --partition_fn list_eval_partition.txt \ --file_out celeba_train \ --fn_root img_align_celeba \ --set 0 ``` Then the validation subset: ```shell python2.7 ../models/real_nvp/celeba_formatting.py \ --partition_fn list_eval_partition.txt \ --file_out celeba_valid \ --fn_root img_align_celeba \ --set 1 ``` And finally the test subset: ```shell python2.7 ../models/real_nvp/celeba_formatting.py \ --partition_fn list_eval_partition.txt \ --file_out celeba_test \ --fn_root img_align_celeba \ --set 2 ``` Afterward: ```shell cd .. ``` ### Small Imagenet Downloading the [*small Imagenet*](http://image-net.org/small/download.php) dataset is more straightforward and can be done entirely in Shell: ```shell mkdir small_imnet cd small_imnet for FILENAME in train_32x32.tar valid_32x32.tar train_64x64.tar valid_64x64.tar do curl -O http://image-net.org/small/$FILENAME tar -xvf $FILENAME done ``` Then, you can format the datasets as follow: ```shell for DIRNAME in train_32x32 valid_32x32 train_64x64 valid_64x64 do python2.7 ../models/real_nvp/imnet_formatting.py \ --file_out $DIRNAME \ --fn_root $DIRNAME done cd .. ``` ### LSUN To prepare the [*LSUN*](http://lsun.cs.princeton.edu/2016/) dataset, we will need to use the code associated: ```shell git clone https://github.com/fyu/lsun.git cd lsun ``` Then we'll download the db files: ```shell for CATEGORY in bedroom church_outdoor tower do python2.7 download.py -c $CATEGORY unzip "$CATEGORY"_train_lmdb.zip unzip "$CATEGORY"_val_lmdb.zip python2.7 data.py export "$CATEGORY"_train_lmdb \ --out_dir "$CATEGORY"_train --flat python2.7 data.py export "$CATEGORY"_val_lmdb \ --out_dir "$CATEGORY"_val --flat done ``` Finally, we then format the dataset into `.tfrecords`: ```shell for CATEGORY in bedroom church_outdoor tower do python2.7 ../models/real_nvp/lsun_formatting.py \ --file_out "$CATEGORY"_train \ --fn_root "$CATEGORY"_train python2.7 ../models/real_nvp/lsun_formatting.py \ --file_out "$CATEGORY"_val \ --fn_root "$CATEGORY"_val done cd .. ``` ## Training We'll give an example on how to train a model on the small Imagenet dataset (32x32): ```shell cd models/real_nvp/ python2.7 real_nvp_multiscale_dataset.py \ --image_size 32 \ --hpconfig=n_scale=4,base_dim=32,clip_gradient=100,residual_blocks=4 \ --dataset imnet \ --traindir /tmp/real_nvp_imnet32/train \ --logdir /tmp/real_nvp_imnet32/train \ --data_path ../../small_imnet/train_32x32_?????.tfrecords ``` In parallel, you can run the script to generate visualization from the model: ```shell python2.7 real_nvp_multiscale_dataset.py \ --image_size 32 \ --hpconfig=n_scale=4,base_dim=32,clip_gradient=100,residual_blocks=4 \ --dataset imnet \ --traindir /tmp/real_nvp_imnet32/train \ --logdir /tmp/real_nvp_imnet32/sample \ --data_path ../../small_imnet/valid_32x32_?????.tfrecords \ --mode sample ``` Additionally, you can also run in the script to evaluate the model on the validation set: ```shell python2.7 real_nvp_multiscale_dataset.py \ --image_size 32 \ --hpconfig=n_scale=4,base_dim=32,clip_gradient=100,residual_blocks=4 \ --dataset imnet \ --traindir /tmp/real_nvp_imnet32/train \ --logdir /tmp/real_nvp_imnet32/eval \ --data_path ../../small_imnet/valid_32x32_?????.tfrecords \ --eval_set_size 50000 --mode eval ``` The visualizations and validation set evaluation can be seen through [Tensorboard](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tensorboard/README.md). Another example would be how to run the model on LSUN (bedroom category): ```shell # train the model python2.7 real_nvp_multiscale_dataset.py \ --image_size 64 \ --hpconfig=n_scale=5,base_dim=32,clip_gradient=100,residual_blocks=4 \ --dataset lsun \ --traindir /tmp/real_nvp_church_outdoor/train \ --logdir /tmp/real_nvp_church_outdoor/train \ --data_path ../../lsun/church_outdoor_train_?????.tfrecords ``` ```shell # sample from the model python2.7 real_nvp_multiscale_dataset.py \ --image_size 64 \ --hpconfig=n_scale=5,base_dim=32,clip_gradient=100,residual_blocks=4 \ --dataset lsun \ --traindir /tmp/real_nvp_church_outdoor/train \ --logdir /tmp/real_nvp_church_outdoor/sample \ --data_path ../../lsun/church_outdoor_val_?????.tfrecords \ --mode sample ``` ```shell # evaluate the model python2.7 real_nvp_multiscale_dataset.py \ --image_size 64 \ --hpconfig=n_scale=5,base_dim=32,clip_gradient=100,residual_blocks=4 \ --dataset lsun \ --traindir /tmp/real_nvp_church_outdoor/train \ --logdir /tmp/real_nvp_church_outdoor/eval \ --data_path ../../lsun/church_outdoor_val_?????.tfrecords \ --eval_set_size 300 --mode eval ``` Finally, we'll give the commands to run the model on the CelebA dataset: ```shell # train the model python2.7 real_nvp_multiscale_dataset.py \ --image_size 64 \ --hpconfig=n_scale=5,base_dim=32,clip_gradient=100,residual_blocks=4 \ --dataset lsun \ --traindir /tmp/real_nvp_celeba/train \ --logdir /tmp/real_nvp_celeba/train \ --data_path ../../celeba/celeba_train.tfrecords ``` ```shell # sample from the model python2.7 real_nvp_multiscale_dataset.py \ --image_size 64 \ --hpconfig=n_scale=5,base_dim=32,clip_gradient=100,residual_blocks=4 \ --dataset celeba \ --traindir /tmp/real_nvp_celeba/train \ --logdir /tmp/real_nvp_celeba/sample \ --data_path ../../celeba/celeba_valid.tfrecords \ --mode sample ``` ```shell # evaluate the model on validation set python2.7 real_nvp_multiscale_dataset.py \ --image_size 64 \ --hpconfig=n_scale=5,base_dim=32,clip_gradient=100,residual_blocks=4 \ --dataset celeba \ --traindir /tmp/real_nvp_celeba/train \ --logdir /tmp/real_nvp_celeba/eval_valid \ --data_path ../../celeba/celeba_valid.tfrecords \ --eval_set_size 19867 --mode eval # evaluate the model on test set python2.7 real_nvp_multiscale_dataset.py \ --image_size 64 \ --hpconfig=n_scale=5,base_dim=32,clip_gradient=100,residual_blocks=4 \ --dataset celeba \ --traindir /tmp/real_nvp_celeba/train \ --logdir /tmp/real_nvp_celeba/eval_test \ --data_path ../../celeba/celeba_test.tfrecords \ --eval_set_size 19962 --mode eval ``` ## Credits This code was written by Laurent Dinh ([@laurent-dinh](https://github.com/laurent-dinh)) with the help of Jascha Sohl-Dickstein ([@Sohl-Dickstein](https://github.com/Sohl-Dickstein) and [jaschasd@google.com](mailto:jaschasd@google.com)), Samy Bengio, Jon Shlens, Sherry Moore and David Andersen.