スポンサードリンク



こんにちは。sinyです。

最近GANについて学習していますが、深層畳み込みGAN(DCGAN)を実装した際の情報を記事にまとめました。

前提として以下のGANの関連記事を読んでおくと理解しやすいと思います。

本記事では下記Githubリポジトリをベースにコードを作っています。

また、書籍などでは大体MNISTデータをコマンド一発でロードして学習させるパターンが多いですが、実際に利用する場合は個別の画像ファイルを読み込む形で実装する必要があるので、Googleドライブ上に準備したねこ画像500枚をランダムにロードして学習させる形のサンプルコードを作りました。

さらにGANでは学習に時間がかかるのでGoogle Corabo上でも実行制限にかかって最後まで学習ができませんので、500エポック毎にパラメータをGoogleドライブ上に保存する形にしています。

DCGANとは?

 

最もシンプルなGANでは生成器と識別器に単純な2層のFeedForwardネットワーク(全結合層とかDenseなどといったりもする)を使いますが、ここに畳み込みニューラルネットワーク(CNN)を用いたものがDCGANです。(下図参照)

DCGANの識別器

下図の通り、識別器のネットワークにCNNを用います。
以下の例では28 x 28 x 1のモノクロ画像を入力として畳み込みを数回実行します。
基本的にバッチ正則化→活性化関数(LeackyReLU)を適用しています。(最初の畳み込みの後は活性化のみ)

最後に入力された画像が本物(1)or 偽物(0)を識別できるようにシグモイド関数をかまして0~1に変換してあげます。

図にも書いてありますが、識別機の学習の際は生成器側のパラメータを更新しないように固定させ、識別器側のネットワークパラメータだけ学習させます。
この点は通常のGANと同じです。

DCGANの生成器

 

生成器も識別器と同様にCNNを適用していきますが、こちらは乱数ベクトルから画像を生成するため通常のCNNではなく転置畳み込みを利用しています。
例えばkerasだとConv2DTransposeを使って簡単に実装できます。

生成器では転置畳み込みで幅と高さを拡大しつつ深度を徐々に下げていきます(256->128-> 64->1)。

サンプルコード

全コードは下記リポジトリからダウンロードできます。

以下、要点だけ解説していきます。

Tensorflowのバージョンを変更する

2020年4月14日現在、Google CoraboのデフォルトのTensorflowバージョンがtensorflow-2.2.0rc2になっていますが、このバージョンだとうまく動作しないので、1.14.0にダウングレードします。

 

その後、以下のコードでGoogleドライブをマウントします。

 

必要なライブラリーをインポートします。

 

今回は、64 x 64のカラー画像を扱うので以下のように設定します。
また、生成器では100次元のベクトルから画像を生成することとします。

 

生成器の定義は以下の通りです。

 

以下のコードを実行してモデルを可視化しています。

 

続いて識別機の定義です。

 

生成器と識別機のコンパイルをします。

 

なお、以下の部分で直近の学習完了時に生成された識別機のパラメータファイル(d_param-50490.hdf5)をロードします。
※パスとファイル名のところは適宜変更してください。

 

また生成器についても直近の学習完了時に生成されたパラメータファイルをロードします。

generatorモデルについてはg_param-xxxxx.hdf5、ganモデルについてはgan_param-xxxxx.hdf5をロードします。
こちらもパスとファイル名は適宜変更してください。

 

訓練メソッドの定義は以下の通りです。

num_of_trialsには前回までに学習したエポック数を指定します。

 

以下の部分でsample_interval変数で指定したエポック毎にモデルパラメータをGoogleドライブ上に保存するようにしています。

 

 

また、以下の部分で生成した画像を表示してGoogleドライブに保存するメソッドを呼び出しています。

 

sample_imagesメソッドは以下の通りです。

 

最後に学習を開始します。
以下の例では、学習を5000エポック行い500エポック毎に生成画像を表示して、モデルパラメータを保存するようにしています。

 

5万エポックほど学習させた結果が以下の通りです。
多少猫っぽい画像になってきていますが精度的にはまだまだですね・・・
もっと学習が必要なのかDCGANの限界なのかわかりませんが、もうしばらく学習鵜を継続してみたいと思います。

上記動画を生成するコードはGitリポジトリ内の「生成動画作成コード.ipynb」を実行すれば作成できますので興味がある方は試してみてください。
※ファイル名の日本語がおかしいですが無視してください・・・

その後の学習結果も適宜更新したいと思います。

以上、DCGANの実装に関するまとめでした。

 

おすすめの記事