Kerasメモ(GAN)
敵対的生成ネットワーク(Generative adversarial Network)を使ったイメージ生成を試してみる。
今回試したソース。
Keras-GAN/dcgan.py at master · eriklindernoren/Keras-GAN · GitHub
モデルの全体像
モデルに関するメモ。
以下、生成モデル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)
学習が進むほど、生成される画像の輪郭がはっきりしてくる(線が細くなる)