conditional GANのラベルの与え方は色々あり、
毎回どうすれば良いかよくわからず迷ってしまう。
githubの実装をみると様々に書かれている。
文献を読むよりも色んな人の実装を漁るほうが知見が貯まるこの頃。
今回はMNISTに対してDRAGANを用いて、
その中でもよく見かける設定を評価してみる。
(DRAGANを用いたのは単に安定しているという理由のみ)
以下の設定のもとでいずれの評価も行った.
- batchsizeは64
- optimizerはAdamを使用(learning rate:1e-4)
- Generatorの構造は3層(1:FC層, 2:Deconv層, 3:Deconv層),
出力層の活性化関数はtanhではなくsigmoidを使用 - Discriminatorの構造は3層(1:Conv層, 2:Conv層, 3: FC層)
- BatchNormalization不使用
Generatorへのラベルの入力方法はバリエーションが少なかったので,
今回は統一して,noiseにそのままconcatした.
代わりにDiscriminatorへのラベルの入力方法を以下でパターンに分類し、
その分類内でGeneratorへ入力するnoiseの次元を変化させ、安定性を評価した。
ちなみに成功すると以下のように、
指定ラベルに応じた画像の生成生成が可能となる。
パターンA: Discriminatorの入力層へラベルを入力する
このパターンのデータフローは下図のようになる。
パターンB: Discriminatorの中間層へlabelを入力する
次は、Discriminatorの入力層ではなく中間層へlabelを入力するパターンBを試す。
パターンC: Discriminatorの入力層と中間層へlabelを入力する
最後に、Discriminatorの入力層と中間層へ両方ともlabelを入力するパターンCを試す。
評価結果
noiseの次元:10 | noiseの次元:50 | noiseの次元:100 | |
---|---|---|---|
パターンA | ○ (7000iterで安定) | ○ (26000iterで安定) | × (生成画像が真っ黒) |
パターンB | ○ (7000iterで安定) | ○ (28000iterで安定) | × (生成画像が真っ黒) |
パターンC | ○ (7000iterで安定) | ○ (19000iterで安定) | × (生成画像が真っ黒) |
今回のconditional DRAGANではラベルの与え方は何でも良く、
noiseの次元が効いてくることが分かった。