Re:ゼロから始めるML生活

どちらかといえばエミリア派です

【写経】TesnorFlowを使ったGANの実装

最近は年度末が近づいたのもあって、なかなかブログを更新できていませんでしたが、少しずつ書いていきます。 前回は雑でもなんでもGANの仕組みを理解しようということで、numpyだけでGANを書いていました。 まともに動かなかったけど。。。

tsunotsuno.hatenablog.com

今回はずーっと前にインストールしておいたTensorFlowを使って、もう少しちゃんとしたGANを書いてみようと思います。

TensorFlowの使い方の勉強は超簡単なニューラルネットを書いたところで終わっています。

tsunotsuno.hatenablog.com

そんでもって、今回参考にした本はこちら。

Learning Generative Adversarial Networks

Learning Generative Adversarial Networks

見ればわかりますが、英語の本なので英語が苦にならない方は結構いい本なのかもしれません。 GANは日本語の解説書がなかなかないので、必然的にネット記事か英語の書籍になります。 この本には、cycleGANとかのサンプルコードもあるので、それだけでも価値があるのかもしれませんね。

設計

GANの細かい中身については前回書いたので前回の記事をご参考ください。 基本的な考え方は前回と一緒なんですが、層がちょいちょい違うので、図示するとこんな感じです。

f:id:nogawanogawa:20180317180813j:plain

この実装ではdeconvolutionはせずに、全結合で入力から出力までデータサイズを拡大しています。 その他、ReLU関数やSigmoid関数を使用して実装しています。

実装

今回のコードは上の本のサンプルコードでほぼそのまま流用。 ちゃんとしたツールを使用するとMNISTでどんな感じの画像が生成されるかが見てみます。

全体はこちら。 https://github.com/nogawanogawa/simpleGAN_tensorflow.git

結果

実際に生成してみると下のような感じです。

しっかりIterationの数を回してみるもんですね。 前回はさっさと止めすぎたのか、活性化関数とか微妙に違うのがまずかったのか、、、 理屈のお勉強だったのでそのへんは目をつぶりましょう。

ちゃんとやればこんな感じですって程度です。

Iteration = 0

f:id:nogawanogawa:20180317174804p:plain

学習する前なんで、まあそうですよね。

Iteration = 1000

f:id:nogawanogawa:20180317174805p:plain

前回はこのへんで学習を止めてしまっていました。 なんとなく真ん中らへんになんか出てきたレベルですね。

Iteration = 5000

f:id:nogawanogawa:20180317174811p:plain

この辺でようやく数字っぽくなってきました。

Iteration = 9000

f:id:nogawanogawa:20180317174826p:plain

もうMNISTオリジナルとそんなに変わらないレベルで出力されています。 あとはイテレーションを増加させればもう少しそれっぽいものができそうですね。

感想

TensorFlowを使うとコードがめっちゃ短く書けますね。

中身の理屈のお勉強を兼ねていたとは言え、前回のコードを書いてた時間を返して欲しいくらいですね。 TensorFlowでのGANの実装を見れたので、次は別のGANのモデルを書いてみたいと思います。