LSGAN

GAN は学習が安定しにくいという問題がある。 それに対し、LSGANは安定的に学習できる。

LSGAN の概要

3.2節のDCGANは損失関数に Binary Cross Entropy を使用し、Sigmoid関数で計算した識別信号[0.0, 1.0] と、正解ラベル1/0の2値で誤差計算を行った。Binary Cross Entropy は、Sigmoid関数に大きい値が入力されると勾配消失し、学習が進まない場合がある。

DCGAN の損失関数: $\displaystyle L(D) = -\mathbb{E}_{x \thicksim p_{data}(x)}[\log D(x)] - \mathbb{E}_{z \thicksim p_z(z)} [ \log (1-D(G(z)))]$

本物画像の損失の第1項の識別信号 $D(x)$ がSigmoid関数だとすると$x$ が$1$以上だと学習に必要な勾配がほとんど失われる。

LSGAN の識別器 D の損失関数$L(D)$は$D(x)=1$ または$D(G(z))=0$、 つまり識別器が本物画像と生成画像を正しく識別できたときに最小化する平均二乗法になる。

$\displaystyle \min_{D} L(D) = \frac{1}{2} \mathbb{E}_{x \thicksim p_{data}(x)} [(D(x) - 1)^2] + \frac{1}{2} \mathbb{E}_{z \thicksim p_z(z)}[D(G(z))^2]$

生成器Gの損失関数 $L(G)$ は、$D(G(z))=1$ つまり生成器が識別器を本物だと騙せたときに最小化する平均二乗関数になる。

$\displaystyle \min_{G} L(G) = \frac{1}{2} \mathbb{E}_{z \thicksim p_z(z)} [(D(G(z)-1))^2]$

準備

データセットの作成

MacやLinux, Google Colab の上では wget がデフォルトで存在するので、Code Cellで次のようにタイプする。

!wget https://www.robots.ox.ac.uk/|vgg/data/pets/data/images.tar.gz -P ./input/
!wget https://www.robots.ox.ac.uk/~vgg/data/pets/data/annotations.tar.gz -P ./input/
!tar -zxvf ./input/images.tar.gz -C ./input
!tar -zvxf ./input/annotations.tar.gz -C ./input

Windowsの場合は、cygwinなどで wgetコマンドを使って手元のフォルダにダウンロードする。 展開すると次のような位置にファイルができる。

./input/images/*.jpg
./input/annotations/xmls/*.xml
./input/trimaps/*.png
[./input/annotations/list.txt の内容(最初の部分)]
#Image CLASS-ID SPECIES BREED ID
#ID: 1:37 Class ids
#SPECIES: 1:Cat 2:Dog
#BREED ID: 1-25:Cat 1:12:Dog
#All images with 1st letter as captial are cat images
#images with small first letter are dog images
Abyssinian_100 1 1 1
Abyssinian_101 1 1 1
Abyssinian_102 1 1 1
Abyssinian_103 1 1 1
Abyssinian_104 1 1 1
Abyssinian_105 1 1 1
Abyssinian_106 1 1 1
Abyssinian_107 1 1 1
Abyssinian_108 1 1 1
...(略)...