最近は年度末が近づいたのもあって、なかなかブログを更新できていませんでしたが、少しずつ書いていきます。 前回は雑でもなんでもGANの仕組みを理解しようということで、numpyだけでGANを書いていました。 まともに動かなかったけど。。。
今回はずーっと前にインストールしておいたTensorFlowを使って、もう少しちゃんとしたGANを書いてみようと思います。
TensorFlowの使い方の勉強は超簡単なニューラルネットを書いたところで終わっています。
そんでもって、今回参考にした本はこちら。
Learning Generative Adversarial Networks
- 作者: Kuntal Ganguly
- 出版社/メーカー: Packt Publishing
- 発売日: 2017/10/30
- メディア: ペーパーバック
- この商品を含むブログを見る
見ればわかりますが、英語の本なので英語が苦にならない方は結構いい本なのかもしれません。 GANは日本語の解説書がなかなかないので、必然的にネット記事か英語の書籍になります。 この本には、cycleGANとかのサンプルコードもあるので、それだけでも価値があるのかもしれませんね。
設計
GANの細かい中身については前回書いたので前回の記事をご参考ください。 基本的な考え方は前回と一緒なんですが、層がちょいちょい違うので、図示するとこんな感じです。
この実装ではdeconvolutionはせずに、全結合で入力から出力までデータサイズを拡大しています。 その他、ReLU関数やSigmoid関数を使用して実装しています。
実装
今回のコードは上の本のサンプルコードでほぼそのまま流用。 ちゃんとしたツールを使用するとMNISTでどんな感じの画像が生成されるかが見てみます。
全体はこちら。 https://github.com/nogawanogawa/simpleGAN_tensorflow.git
結果
実際に生成してみると下のような感じです。
しっかりIterationの数を回してみるもんですね。 前回はさっさと止めすぎたのか、活性化関数とか微妙に違うのがまずかったのか、、、 理屈のお勉強だったのでそのへんは目をつぶりましょう。
ちゃんとやればこんな感じですって程度です。
Iteration = 0
学習する前なんで、まあそうですよね。
Iteration = 1000
前回はこのへんで学習を止めてしまっていました。 なんとなく真ん中らへんになんか出てきたレベルですね。
Iteration = 5000
この辺でようやく数字っぽくなってきました。
Iteration = 9000
もうMNISTオリジナルとそんなに変わらないレベルで出力されています。 あとはイテレーションを増加させればもう少しそれっぽいものができそうですね。
感想
TensorFlowを使うとコードがめっちゃ短く書けますね。
中身の理屈のお勉強を兼ねていたとは言え、前回のコードを書いてた時間を返して欲しいくらいですね。 TensorFlowでのGANの実装を見れたので、次は別のGANのモデルを書いてみたいと思います。