サイトアイコン NegativeMindException

DCGAN (Deep Convolutional GAN):畳み込みニューラルネットワークによる敵対的生成

引き続きGAN(敵対的生成ネットワーク)手法のお勉強。


GAN (Generative Adversarial Network):敵対的生成ネットワーク アルゴリズムまとめ
これまで勉強したGAN (Generative Adversarial Network):敵対的生成ネットワーク手法のアルゴリズム一覧。


次はGANsの発展形のDCGAN (Deep Convolutional GAN)について。
GANの例としてはオリジナルのGANよりもDCGANの方がよく紹介されているイメージ。

DCGAN (Deep Convolutional GAN)

DCGAN (Deep Convolutional GAN)ICLR 2016で発表された論文 Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networksで提案された生成モデル。
オリジナルのGANでは生成画像がぼやけていたが、DCGANではより自然な画像の生成が可能になっている。

DCGANも基本的にはオリジナルのGANの考え方に則っており、GeneratorDiscriminatorを競わせるように学習する。なので、全体の構造を概念図として表すとオリジナルのGANと同様になる↓

オリジナルのGANとの大きな違いは、GeneratorDiscriminatorそれぞれのネットワークに全結合層ではなく、畳み込み層(と転置畳み込み層)を使用している点。
そして、GANの学習が安定しない問題に対しては、Batch Normalization (バッチ正規化)の導入や、活性化関数にReLUだけでなくtanh, Leaky ReLUを使用している。



では、Generator, Discriminatorそれぞれのネットワーク構造について詳しく見て行こう。

Generatorのネットワーク構造

Generatorのネットワークでは以下の図のように、入力となる100次元のノイズベクトルZから転置畳み込みによって徐々に64×64サイズの画像へとアップサンプリングしていく↓

全結合層やpooling層は使用しない。
この図では省略されているけど、それぞれの転置畳み込み層の後にSegNetの記事でも解説したBatch Normalizationと活性化関数が入ります。活性化関数には基本的にReLUを使用し、最終層だけtanhを使用している。

転置畳み込み (transposed convolution)

やや余談ですが、この論文でfractional-strieded convolutionsと呼ばれているアップサンプリング処理は、基本的には以前FCNの記事で逆畳み込み(deconvolution)と呼んでいた処理と同様です。



後の様々な論文で逆畳み込みという呼び方が否定されているので、以後は転置畳み込みと呼ぶことにしましょう。
fractional-strieded convolutionsは基本的にはこの図のような処理で、strideが2でpaddingが0の処理↓

追記;転置畳み込みについてはこちらの図解がとても分かりやすい↓

Discriminatorのネットワーク構造

Discriminatorは、Generatorのアップサンプリング過程を逆にしたようなダウンサンプリング構造になる。
基本的には画像識別の畳み込みニューラルネットワークの構造を踏襲しているが、pooling層が無く、活性化関数にはReLUの代わりにLeaky ReLUを使用する。


スポンサーリンク

poolingを畳み込みで代用する

通常、物体認識の畳み込みニューラルネットワークでは、max poolingで特徴マップを縮小(集約)して被写体の並進移動や形状変化をある程度吸収できるようにしている。これは、物体認識では物体の細かな特徴よりも全体を表す特徴を捉えた方が効果的なため。

一方、GANでは細かな特徴が重要となるため、poolingで細かな情報が欠落しては困る。そこで、DCGANDiscriminatorでは、poolingの代わりにstride 2の畳み込み処理を行うことで細かな特徴の欠落を防いでいる。

Leaky ReLU活性化関数

GANの学習の不安定性に対処するため、Discriminatorの活性化関数にはReLUの代わりにLeaky ReLUが導入されている。
通常のReLUでは入力が0未満の場合に出力が0になってしまうが、Leaky ReLUは入力が0未満でも出力が0にならず、負の値を出力する。これによって学習中に勾配が0になってしまうのを防ぐことができ、誤差逆伝搬が滞りにくくなっている。(その代わり、Leaky ReLU用のハイパーパラメータが増えている)

活性化関数ごとの出力値の違いはこちらの比較図が分かりやすい↓

DCGANの学習

DCGANの目的関数や学習ステップはオリジナルのGANと同様なので割愛。


DCGANによる画像生成

論文では、ベッドルームや人の顔画像の生成結果が紹介されている。

入力ベクトルの操作による生成画像の変化

入力ベクトルを変化させることで顔を別の向きへと滑らかに補間できる↓

さらに、生成元となる入力ベクトルの演算によって、要素の足し算、引き算を行うことができる。これは自然言語処理のWord2Vecと同じ考え方。
例えば。

といった具合↓

ちなみに、入力ベクトルを変えると生成結果が変化する様子を体感できるデモサイトを見つけた↓
https://carpedm20.github.io/faces/

DCGANの実装

PyTorch公式で顔画像を生成するDCGANのチュートリアルがあるので、試すのは簡単。
チュートリアルのソースコードはこちら↓
https://github.com/pytorch/examples/tree/master/dcgan

オイラも試しにやってみた↓
https://github.com/NegativeMind/DCGAN-Face-Pytorch

学習過程の可視化

学習過程を可視化した動画↓



例のごとく、GeneratorDiscriminatorのLossの変化だけを見ると学習が収束へ向かっているのかさっぱりわからない(笑)



次はCGAN (Conditional GAN)を勉強しよう。


GAN (Generative Adversarial Network):敵対的生成ネットワーク アルゴリズムまとめ
これまで勉強したGAN (Generative Adversarial Network):敵対的生成ネットワーク手法のアルゴリズム一覧。


スポンサーリンク

関連記事

  • TensorSpace.js:ニューラルネットワークの構造を可視化するフレームワーク
  • 組み込み向けのWindows OS 『Windows Embedded』
  • GAN (Generative Adversarial Networks):敵対的生成ネットワーク
  • Unityで強化学習できる『Unity ML-Agents』
  • PSPNet (Pyramid Scene Parsing Network):ディープラーニングによ...
  • Deep Learningとその他の機械学習手法の性能比較
  • PythonでMayaのShapeノードプラグインを作る
  • 3Dモデルを立体視で確認できるVRアプリを作っている
  • FacebookがDeep learningツールの一部をオープンソース化
  • Windows10でPyTorchをインストールしてVSCodeで使う
  • 動画で学ぶお絵かき講座『sensei』
  • データサイエンティストって何だ?
  • Russian3DScannerのトポロジー転送ツール『WrapX』
  • OpenGV:画像からカメラの3次元位置・姿勢を推定するライブラリ
  • ZScript
  • UnrealCV:コンピュータビジョン研究のためのUnreal Engineプラグイン
  • Raspberry Piでセンサーの常時稼働を検討する
  • UnityでLight Shaftを表現する
  • 機械学習手法『Random Forest』
  • Point Cloud Libraryに動画フォーマットが追加されるらしい
  • JavaScriptとかWebGLとかCanvasとか
  • ポリゴンジオメトリ処理ライブラリ『pmp-library (Polygon Mesh Process...
  • PythonのHTML・XMLパーサー『BeautifulSoup』
  • Python拡張モジュールのWindows用インストーラー配布サイト
  • trimesh:PythonでポリゴンMeshを扱うライブラリ
  • iPhone x ロボットハッカソン~RomoのiPhone用SDKで目覚ましアプリを作る~
  • WordPress on Windows Azure
  • オープンソースの顔の動作解析ツールキット『OpenFace』
  • html5のcanvasの可能性
  • cvui:OpenCVのための軽量GUIライブラリ
  • Faceshiftで表情をキャプチャしてBlender上でMakeHumanのメッシュを動かすデモ
  • TorchStudio:PyTorchのための統合開発環境とエコシステム
  • AR (Augmented Reality)とDR (Diminished Reality)
  • Adobe MAX 2015
  • 書籍『3次元コンピュータビジョン計算ハンドブック』を購入
  • Google App Engineのデプロイ失敗
  • ブログが1日ダウンしてました
  • Manim:Pythonで使える数学アニメーションライブラリ
  • 「ベンジャミン·バトン数奇な人生」でどうやってCGの顔を作ったのか
  • Python.NET:Pythonと.NETを連携させるパッケージ
  • MVStudio:オープンソースのPhotogrammetryツール
  • BlenderのPython環境にPyTorchをインストールする
  • モバイルバージョンを終了