ichou1のブログ

主に音声認識、時々、データ分析のことを書く

Kerasメモ(GAN)

敵対的生成ネットワーク(Generative adversarial Network)を使ったイメージ生成を試してみる。

今回試したソース。
Keras-GAN/dcgan.py at master · eriklindernoren/Keras-GAN · GitHub

モデルの全体像
f:id:ichou1:20190406104803p:plain

モデルに関するメモ。
以下、生成モデルGeneratorを"G"、識別モデルDiscriminatorを"D"とする。

  • Gのインプットは、標準正規分布からサンプリングされる値を使う(一様分布を使うパターンもある)
  • G、Dともに畳み込みの後にプーリングは行わず、BatchNormalizationレイヤを使う
  • Gの最後のActivationレイヤは"tanh"("sigmoid"を使うパターンもある)
  • Dでは、LeaklyReLUレイヤを使う(Gではrelu)
  • Dでは、Dropoutレイヤを使う(LeaklyReLUレイヤの後)
  • Dでは、ZeroPadding2Dレイヤを使って、テンソルのbottomとrightにゼロを追加
  • GAN(G、Dを結合したモデル)では、Dの学習を凍結する

モデルにおけるレイヤーのtrainableプロパティは、compile( )を呼んだ時点で有効になる。
FAQ - Keras Documentation

# Build and compile the discriminator
self.discriminator = self.build_discriminator()
self.discriminator.compile(loss='binary_crossentropy', ...
# --> ここでの「self.discriminator」はモデル(trainable=true)
...
                                                       
# The combined model  (stacked generator and discriminator)
z = Input(shape=(self.latent_dim,))
self.discriminator.trainable = False
self.combined = Model(z, self.discriminator(self.generator(z)))
self.combined.compile(loss='binary_crossentropy', optimizer=optimizer)
# --> ここでの「self.discriminator」はレイヤ。モデル「self.combined」の構成要素(trainable=false)

学習が進むほど、生成される画像の輪郭がはっきりしてくる(線が細くなる)
f:id:ichou1:20190406113352p:plain
f:id:ichou1:20190406113415p:plain
f:id:ichou1:20190406113427p:plain