DCGANのメモ.
メモ
- なぜ生成器の出力層はtanh関数なのか?
- 学習が速い
- 画像はスパースであり-1ではなく0が多いと学習しづらい
- tensorflow - Generative adversarial networks tanh? - Stack Overflow
- 仮に[0 ,1]で入力画像を正規化しているならば,sigmoid関数を使う.
- 学習が速い
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
-> (x-μ)/σ で正規化.このときは (x-0.5)/0.5 = 2x-1 となるので,[-1, 1] にスケーリングできている.
ちなみに上は3チャンネル(RGB)の場合であり,1チャンネル(白黒)のときは
transforms.Normalize((0.5, ), (0.5, ))
-
Transposed Convolution(転置畳み込み)の計算
- out_size = (in_size-1) * stride -2*padding + kernel_size + output_padding
-
識別器のreturnでsqueeze()をかますのはなぜか?
- squeeze(): 余計に1が入っているshapeを削除する
- (A×1×B×1) -> (A×B)
- squeeze(): 余計に1が入っているshapeを削除する
-
識別器の損失関数をマイナスにするのはなぜか?
- 損失関数は,識別器が最大化,生成器が最小化する.すなわち,識別器の損失関数をマイナスにすれば,識別器を最小化することと同義.
-
生成器の損失関数を,log(1-D(G(z)))から-log(D(G(z)))とするのはなぜか?
- そのままだと,1.0付近で勾配が急になり,0付近では緩やかになる.つまり,学習初期の更新幅が小さく学習が進まない.
- 結局,D(G(z))が1に近いほど値が小さくなってくれればよいので,-log(D(G(z)))と書き換えてしまう.このとき,0付近で勾配が急になり,識別器をうまく騙せない学習初期ほど更新幅が大きくなってくれる.
-
detach(): 変数から定数を作る
-
GANの損失関数はJSダイバージェンスと同じ.
- 損失関数を最小化することはJSダイバージェンスを最小化することと同じ.
- よって,モデル分布とデータ分布を可能な限り近づけようとしていることと同じ.
- 理論的な説明はちょっと記事にするには重すぎるので割愛.
-
torchsummary: モデルのshapeを確認できる.