背景
いままで教師あり学習の分類問題ばかりやってきたので、少し気分を変えて、ディープラーニングで画像の生成とかやってみたい思った。
DCGAN とは?
一言で言えば、与えられた画像データセットを元に、それによく似た感じの画像を出力してくれるシステム。詳しくは、
TensorFlowによるDCGANでアイドルの顔画像生成
あたりを参照のこと。
実際に自分でコードを書くのがおすすめ。コードを書くまでは何のことだかさっぱりわからなかったが、書いてみたら、なるほど、となった。
GANの動作原理は、「偽札を作る人と取り締まる警察」の関係に例えられる。偽札を作る人はより精巧な偽札を作ろうと努力し、警察は精巧な偽札も見破れるようにしようと努力する。そうすると偽札(ここでは生成される画像のこと)はどんどん精巧になって本物と区別がつかなくなるのだ。DCGAN では「偽札を作る人」「警察」をそれぞれ別のニューラルネットワークが担当する。
実装
たぶん、元論文に近い実装は、DCGAN implementation by TensorFlow。私は、これを Keras で実行してみたのだが、どうにもうまく行かなかった。
そこで、keras-dcganに従ってみた。このサンプルコードでは、MNIST の数字をうまく学習している。ただ、問題点としては、この issueにあるように、元論文とはかなり違うネットワーク構成を取っている。GAN(Generative Adversarial Network, 生成的敵対的ネットワーク?)であるのは確かだと思うが。
だから私の実装も GAN の雰囲気をつかむもの、という程度にとらえてもらえれば、と思う。
Github から clone して、python keras-dcgan.py
と実行すれば、とりあえず gen_images
ディレクトリ以下に画像が生成され始める。in_images
に学習したい任意の画像(のフォルダ)を入れてほしい。in_images/images
に入っている初音ミクの画像は、animeface-character-datasetからお借りしました。深く感謝します。
実行結果
animeface-character-datasetの画像約15000枚に基づいて学習させた(これは Github のレポジトリには入っていない。各自追試したい場合は、animeface-character-dataset をダウンロードしてみてください)。
元の画像
step 1000(のべ55000枚学習後)
step 3000(のべ165000枚学習後)
step 10000(のべ550000枚学習後)
step 29900(のべ1644500枚学習後)
感想
今回の実装では、どうも過学習の影響が出やすいというか、元画像を完全にコピーした画像が生まれやすい傾向がある気がする。とはいえ、画像生成器(Generator)に乱数しか入力していないことを思えば、驚くべき学習能力ではある。GAN を安定的に使うのはなかなか難しいが、安定化の新しい手法もいろいろ提案されているようなので、余裕があるときに、また取り組んでみたい。