PyTorch1.0でDCGANチュートリアルを動かしてみた

# PyTorch1.0でDCGANチュートリアルを動かしてみた

PyTorch初心者がDCGANチュートリアルをしてみたのをご紹介します。
PyTorch1.0で生成モデルを使える環境構築が当面の目標でしたので、このチュートリアルが最適だと考えました。

この記事は、記憶をたどりながら自分が復習することが主目的ですので、あいまいな部分がかなりあります。
また、高度なことをご期待の方は、ご期待に沿えないと思いますので、申し訳ありません。
初心者のつまずきポイントの参考くらいにしかならないかもしれません。

## 今回実行したチュートリアル

実行したのは下記リンクのDCGAN TUTORIALです。英語です。フォルダ名にbeginnerって入ってますね。
https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html
CelebAというセレブの顔写真を約20万枚集めたデータセットを使って、新しい顔を作ります。
![dcgan_face](https://pytorch.org/tutorials/_images/sphx_glr_dcgan_faces_tutorial_001.png)

## 環境とPyTorchセットアップ

### 環境
私の環境は下記の通りです。
- OS: Windows 10 Pro
- CPU: Intel Xeon E3-1240v3 3.40GHz
- メインメモリ: 8GB
- GPU: NVIDIA GeForce GTX 1050 Ti 4GB
- Disk: Samsung SSD 860 EVO 500GB
OSライセンス付中古PCを約3.2万円で購入し、モニタ1万円未満、GPU2万円未満、SSD1万円未満の総額約7万円です。
メモリスロットがあと2つ空いているので、影響が大きければ買い足すかもしれません。

### Python(Anaconda(Visual Studio Community))インストール
Python環境は、[Visual Studio Community](https://visualstudio.microsoft.com/ja/
)でAnaconda3(64bit)を入れました。
インストール方法は省略します。

これまでAnacondaのサイトからダウンロードして入れていましたが、NVIDIAのCUDAインストールでC++コンパイラが必要だったこともあり、一緒に入れられたのでそうしました。他にもAzure連携などで良いことあるのかな？また、今回はJupyter Notebookでやっていますが、VScodeでの開発に移行したいとも思っています。
尚、CUDAはCondaコマンドでも入るので、NVIDIAからインストールしたCUDAがどう影響しているのかは未検証です。（たぶんCondaだけで良さそうな感触があるのですが、まず動くこと優先でやっているのですみません）

### Conda環境

Condaで環境を作ってインストールします。今回色々なライブラリを共存して比較できる環境にしたいと思い、allという名前にしてます。
色々インストールするのは大変なので、[こちら](https://qiita.com/yubessy/items/2dd43551aa8308dc7eca)を参考にさせて戴き環境設定をexportして、諸々のライブラリを入れました。
pythonやcondaのバージョンなどはこちらです。`conda update conda`や`conda update --all`もやったと思います。（思い...出せない）

```
> conda list python
# packages in environment at ...\AppData\Local\conda\conda\envs\all:
#
# Name                    Version                   Build  Channel
ipython                   7.2.0            py36h39e3cac_0
ipython_genutils          0.2.0            py36h3c5d0ee_0
msgpack-python            0.5.6            py36he980bc4_1
python                    3.6.7                h9f7ef89_2
python-dateutil           2.7.5                    py36_0
python-libarchive-c       2.8                      py36_6

> conda list conda
# packages in environment at ...\AppData\Local\conda\conda\envs\all:
#
# Name                    Version                   Build  Channel
anaconda                  2018.12                  py36_0
anaconda-client           1.7.2                    py36_0
anaconda-navigator        1.9.6                    py36_0
anaconda-project          0.8.2                    py36_0
conda                     4.5.12                   py36_0
conda-build               3.17.6                   py36_0
conda-env                 2.6.0                         1
conda-verify              3.1.1                    py36_0
msys2-conda-epoch         20160418                      1
```

### PyTorchインストール
[PyTorchサイト](https://pytorch.org/)にある通り、下記でインストールします。
cudaのバージョン指定もできますが、指定の無い9.0が現時点の推奨バージョンなんだろうと思い選びました。

```
> conda install pytorch torchvision -c pytorch
```

インストール時の記録を取っていないので曖昧ですが、関連するライブラリが同時にインストールされます。
現在の状況は下記の通りです。

```
>conda list torch
# packages in environment at ...\AppData\Local\conda\conda\envs\all:
#
# Name                    Version                   Build  Channel
pytorch                   1.0.0           py3.6_cuda90_cudnn7_1    pytorch
torchvision               0.2.1                      py_2    pytorch

>conda list cud
# packages in environment at ...\AppData\Local\conda\conda\envs\all:
#
# Name                    Version                   Build  Channel
cudatoolkit               9.0                           1
cudnn                     7.1.4                 cuda9.0_0
```

conda環境でcudatoolkit9.0が入っていますが、PCには下記の通り10.0が入っています。

```
>nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:04_Central_Daylight_Time_2018
Cuda compilation tools, release 10.0, V10.0.130
```

## チュートリアル実行

### Jupyter Notebookでチュートリアルを開く
[チュートリアルサイト](https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html
)の一番下にある[Download Jupyter notebook: dcgan_faces_tutorial.ipynb](https://pytorch.org/tutorials/_downloads/e9c8374ecc202120dc94db26bf08a00f/dcgan_faces_tutorial.ipynb)からjpynbファイルをダウンロードし、PyTorchをインストールした環境のJupyter Notebookから開きます。

あとは上から実行して終わりですが、思い出しながらつまづきポイント（覚えているのはここ）を中心にご紹介します。

### CelebAのダウンロードと解凍
チュートリアルに（英語で）書いてある通り、[Celeb-A Faces dataset](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html) をダウンロードして解凍して、フォルダの参照(dataroot)と合わせます。
ただ [Celeb-A Faces dataset](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html) のサーバがbusyらしく、何度やってもダウンロードできません。
（英語で）紹介されている [Google Drive](https://drive.google.com/open?id=0B7EVK8r0v71pWEZsZE9oNnFzTm8) からImgフォルダにある img_align_celeba.zip をダウンロードします。1.4GBあるのでかなり時間がかかります。
1.4GBのzipファイルを解凍するのに、ものすごく時間がかかります。計っていませんが、体感1時間以上はかかっていたと思います。
202,599個のjpgファイルが作成されました。

### CelebAの読み込み
チュートリアルに下記説明がありますが、慣れないと分かりにくいですね。

```
/path/to/celeba
    -> img_align_celeba
        -> 188242.jpg
        -> 173822.jpg
        -> 284702.jpg
        -> 537394.jpg
           ...
```

ここでのポイントは下記datarootに入れるのは、上記の"/path/to/celeba"であって、"/path/to/celeba/img_align_celeba"ではないということです。サブフォルダ別に分類タスクをするために、こういう仕様なんだと思います。（今回は分類しませんが）

``` python
# Root directory for dataset
dataroot = "data/celeba"
```

最初にデータセットを読み込む時は時間がかかりましたが、2回目からは早く、何か工夫されているのでしょうね。
データセットの読み込みができたら、datasetオブジェクトが下記のように作られています。

``` python
In: dataset
Dataset ImageFolder
    Number of datapoints: 202599
    Root Location: .../Data/CelebA/
    Transforms (if any): Compose(
                             Resize(size=64, interpolation=PIL.Image.BILINEAR)
                             CenterCrop(size=(64, 64))
                             ToTensor()
                             Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
                         )
    Target Transforms (if any): None
```


### Trainingと結果
GANとは、DCGANとは、Generator（生成器）とは、Discriminator（判別器）とは、については色々なサイトで解説戴いているので省略します。
Trainingは夜回したので、かかった時間を計っていませんでしたが、朝には終わっていました。timeを使って表示するようにすべきですね。今後の課題です。（追記：time.time()で計測したところ、3099秒（約52分）で5epochが終わっていました。1epochで約10分ですね。）
結果として下記のように、チュートリアルサイトとほぼ同じ結果が得られました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/271789/afd78e71-7b44-3dc7-35d3-25edeb01a034.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/271789/282cb1d8-5e76-5433-04ae-6f27327f7616.png)

Training中、タスクマネージャーのパフォーマンスを見ると下記のような状態です。GPUのメモリは意外と余裕がありますね。
![snap_pytorch_dcgan_20190105.PNG](https://qiita-image-store.s3.amazonaws.com/0/271789/7535177a-7234-962b-ef6e-d142630b0c94.png)
チュートリアルではepochs=5, batch_size=128です。
epochsを10に増やしたり、bacth_sizeを1024まで大きくしても、動いたものの結果に改善はみられませんでした。bacth_size=1024ではGPUメモリ3.5GB使用されました。

## 所感と今後の抱負
PyTorch1.0でDCGANが動き、生成モデルのための構築環境が問題ないことを確認できたことが一番よかったです。
PyTorchの基本的な使い方がまだわかっていないので、簡単なチュートリアルをいくつかやって感触を掴んだら、自分で書いていきたいと思います。
最後まで読んでいただきありがとうございます。