MNIST dataset, TensorFlow, そのsubsets

  • ガウシアン過程でのディープラーニングを実装したnngpパッケージでは、MNISTデータセットチュートリアルに用いている
  • MNISTは機械学習でよく用いられるデータセットでTensorFolwのチュートリアルでも用いられ、実際TensorFlowのパイソンパッケージにはその読み込み関数もある
  • nngpパッケージでは、Training set, Validation set, Testing setの3サブセットをランダムに生成しているのだが、初心者である自分には、これがどうなっているのかわかりにくい
  • そして、MNISTデータセット、そのTensorFlow活用についての記事も見つかるのだが、初心者にである自分にはこんがらがってしまう
  • ということで、以下に整理する
  • MNISTデータセットは、もともとはTraining set とTesting setに分かれている。それぞれが画像ファイルとその画像の「答え」であるラベル(0,1,2,...,9)との情報である。それが都合4枚のファイルとしておかれている。
    • こちらの記事で言うところの、train-images-idx3-ubyte: 学習用の画像セット、train-labels-idx1-ubyte: 学習用のラベルセット、t10k-images-idx3-ubyte: 検証用の画像セット、t10k-labels-idx1-ubyte: 検証用のラベルセット、の4つ
    • これを、Training 60000、Testing 10000と呼ぶことにする
  • TensorFlowでは、こちらにあるように、この4ファイルを読み込んで、Training, Validation, Testingの3分類する。この3分類(Training,Validation,Testing)と、オリジナルの2分類(Training, Testing)とが紛らわしいので、TensorFlowの3分類は、tf.Training, tf.Validation,tf.Testingと呼び分けることにする
    • ここで、Training (60000) = tf.training + tf.validation, Testing (10000) = tf.testingという関係にある
    • TensorFlowでは、オリジナルの60000データセットを2つに分けて、tf.Trainingとtf.Validationとにしているわけである。そして、その分割が、55000と5000である、と、TensorFlowの解説文に書いてある(こちら)。ただし、この分割は引数指定で可変らしく、実際、nngpパッケージでは、以下のようなコマンドにより、tf.Training 50000 + tf.Validation 10000とにしているようだ
datasets = input_data.read_data_sets(
      data_dir, False, validation_size=10000, one_hot=True)
    • このTensorflowパッケージの"/tensorflow/examples/tutorials/mnist/input_data.py"にある以下のコードから読むと、VALIDATION_SIZEをデフォルトの5000から10000に書き換える処理をしているらしい
def read_data_sets(train_dir, fake_data=False, one_hot=False):
  class DataSets(object):
    pass
  data_sets = DataSets()

  if fake_data:
    data_sets.train = DataSet([], [], fake_data=True, one_hot=one_hot)
    data_sets.validation = DataSet([], [], fake_data=True, one_hot=one_hot)
    data_sets.test = DataSet([], [], fake_data=True, one_hot=one_hot)
    return data_sets

  TRAIN_IMAGES = 'train-images-idx3-ubyte.gz'
  TRAIN_LABELS = 'train-labels-idx1-ubyte.gz'
  TEST_IMAGES = 't10k-images-idx3-ubyte.gz'
  TEST_LABELS = 't10k-labels-idx1-ubyte.gz'
  VALIDATION_SIZE = 5000
...
    • いずれにしろ、Tensorflowパッケージが持つ、MNISTデータセット読み込み関数により、data_sets.train, data_sets.validation, data_sets.testの3分割が得られる
  • サブセット化
    • nngpパッケージではこのようにして得られたdata_sets.train, data_sets.validation,data_sets.testから、それぞれサブセットを乱択している
    • 乱択を完全に自由にやってしますと、0,1,2,...,9の10種類がちゃんと含まれない不完全なサブセットができてしまうという問題があるためか、ちゃんとしたサブセット作成をするには、単なる乱数発生では済ませられない。したがって、nngpでは、かなり長いコードを書いている:こちらの_select_mnist_subset関数。ちなみに、TensorflowパッケージのMNIST読み込み関数を使って、validation_size=10000指定することで、data_sets.train, data_sets.validation, data_sets.testは、それぞれ、50000,10000,10000となっているわけで、nngpのチュートリアルではtrainingセットの数を減らして(デフォルトで100)、実行している。