ニートがプログラミングするブログ(はてな出張所)

ニートがプログラミングするブログです。今は主にコンピュータビジョンに関することをやっています。

Batch Normalizationを使わないDCGAN

自己符号化器を使った事前学習をDCGANに適用したものは、顔のようなバリエーションが比較的少ないものならば機能しました。
しかし背景画像のようなバリエーションが豊富なものにはうまく機能しませんでした。
本来ならDCGANの論文にあるようにBatch Normalizationを使うべきなのですが、TensorFlowでの使い方がよくわかりませんでした。
tf.contrib.layers.batch_normを使ってみましたが、おそらく私の実装ミスのせいでうまくいきませんでした。
そこでいろいろと試行錯誤をして良い感じの設定にすることで、Batch Normalizationを使わなくても画像を生成させるのに成功しました。

1.重要なポイント
・最適化手法:Adamを使い学習率を0.0002に、beta1を0.5に設定する。DCGANではお決まりの方法です。


・discriminatorの出力:discriminatorの出力はオリジナル画像ならば0をgeneratorが作った画像ならば1を出力するようにトレーニングする。

 

・ネットワークの構造:disriminatorとgeneratorのネットワークは対称となるようにしなければなりません。どちらか一方のフィルタ数を多くするとうまくいきません。


・活性化関数:generatorではeluを、discriminatorでは傾き0.2のleaky reluを使用する。ただしどちらも最終層では恒等関数にする。活性化関数をreluにしたり、両方eluにしたりするとうまく生成されません。


・重みの初期化:Xavierの方法(名前は違うかもしれません)で初期化する。標準正規分布の乱数にscaleを掛けたものを初期値とする。scale=sqrt(2.0/s)で、sは現在の層のニューロンと前の層のニューロンがいくつつながっているかを示している。畳み込みの場合には、s=カーネルの高さ×カーネルの幅×入力チャネル、となる。全結合の場合には前の層のニューロン数をsとする。詳しくは「ゼロから作る Deep Learning」の本かgithubにある実装を見てください。


・Global Average Pooling:Discriminatorで数回畳み込んだ後で全結合ではなくGlobal Average Poolingを使用して出力層と結合する。Global Average PoolingについてははじめてのGANがわかりやすいです。


・入力:入力ベクトルzは標準正規分布の乱数を使用する。-1から1までの一様乱数の方がいろんな画像が出力されやすいです。

2.実験結果
今回はPlaces2というデータセットを利用しました。
このデータセットは学術研究か教育目的においてのみ使用できます。
たぶんこの記事も学術研究にぎりぎり当てはまるので使用しました。
Place2には水族館や城、ベッドルームなど多くのカテゴリのデータがあります。
今回はより複雑なデータから画像を生成できることを示すために、その中から「ベッドルーム」「塔」「城」「水族館」「日本庭園」の5カテゴリのデータを使用しました。
一応それっぽいのは生成できましたが、日本庭園感が強すぎますね。
他のデータはどこへ行ってしまったのでしょうか?
それに全体的に似たり寄ったりな画像が出来てしまいました。 途中までは割りといろんな画像が生成されるのに、学習を多くさせると同じような画像しか生成しなくなってしまう。

生成画像

f:id:suzuichiblog:20170215155806j:plain

 

DCGANでよくあるアレ

f:id:suzuichiblog:20170215155826j:plain

 

3.感想など
ソースコードgithubにあげてあるのでご自由にお使いください。削除しました。
正直言ってなぜこのような設定でうまくいくのか分かりませんが、とりあえず生成できて安心しました。
今後はきれいに画像を拡大できるようにしたいです。
そうすれば今回作った64x64の画像を512x512のような大きな画像に出来るはずです。