GAN の学習に必要な教師データ数を MNIST で検証してみた。


【背景】

深層学習のトレーニングには,精度の確保のために大量の教師データが必要な事が知られています。(特に画像認識)
 ・https://www.youtube.com/watch?v=NKpuX_yzdYs (Andrew Ng 氏の講演動画)
 ・http://yusuke-ujitoko.hatenablog.com/entry/2017/07/15/004540
例えば,有名なデータセットの枚数は下記ととても多いです。
 ImageNet:1400 万枚(~700 枚/クラス)
 CIFAR10: 60000 枚(10000 枚/クラス)
 MNIST: 65000 千枚(10000 枚/クラス)
特に MNIST に至っては手書きの数字を認識させるのに,1 種類当たりおよそ 1 万枚もの教師画像が存在することに驚きすら感じます。
(もちろん,クラス分類するだけなら SVM などを使えばデータは少なくて済むとは思いますが)

一方で,2014 年から研究が盛んな GAN は,一般に学習が難しいと言われていますが,
画像認識のように教師データの数 (GAN で言うところの Real データ数) と学習の成否の関連はあまり論じられていないように思えます。
GAN の研究で頻出する LSUNベッドルームで 300 万,CelebA で 20 万とこれもまた膨大なデータ数です。

今回,どれだけの Real データと競争させれば Generator がそれらしい画像を生成するようになるのか、MNIST で試してみました。
(画像認識のタスクで必要な教師データの補充に GAN の生成画像を活用できるとよく言われるので,必要な画像のオーダーとしては GAN の方が少ないだろうと予想はできます)

モデル条件

 Collection of generative models (https://github.com/hwalsuklee/tensorflow-generative-model-collections) の
 GAN.py コードを参考に,データのロード部分だけ変更。

utils.py
def load_mnist(dataset_name):

    x_train = pd.read_csv('x_train_df_10000.csv')
                          #x_train_df_10000.csv:  MNIST のデータから 10000 行分だけ残したファイル
    x_train = np.array(x_train)
    trX = x_train.reshape(200, 28, 28, 1)

    t_train = pd.read_csv('t_train_df_10000.csv')
    t_train = np.array(t_train)

    X = trX 
    y = t_train.astype(np.int)

    return X, y

結果

学習に用いた MNIST の Real データ数と Generator の生成画像です。


1 万枚での生成画像は 6.5 万枚より少しぼやけているように見えますが,さほど変わりません。

1000 枚では生成が少し遅くなるものの,手書き数字は生成されます。ノイズのようなドットが散見されます。

500 枚の学習では,生成画像が一部崩れていますが,それでも大部分の数字は生成できています。

200 枚では,手書き数字が生成されません。閾値は 200 枚と 500 枚の間のようです。

もちろんこれはあくまで 28×28 と画像サイズの小さい MNIST での結果ですので,サイズ の大きな画像になると必要な枚数はもっと増えてくると思います。

GAN の用途は今後色々と提案されて行くと思いますが,実用途においては対象がニッチになる程,Real データの確保が課題の一つになると考えているので,今回興味本位でやってみました。