Python

MNIST データの仕様を理解しよう

投稿者 : OSCA

MNIST データの仕様を理解しよう


 人工知能・機械学習の勉強をしていると、チュートリアル的なサンプルデータとして頻繁に登場するのが MNIST のデータです。 たしかにとても使い勝手がよく重宝するデータだと思いますが、そもそもどんな仕様のデータなのか、そのデータ構造については理解しておく必要があります。 ここでは MNIST データの仕様についてまとめてみたいと思います。

MNIST データとは?

 MNISTのデータは、手書きで書かれた数字を画像にした画像データ(image)と、その画像に書かれた数字を表すラベルデータ(label)から構成されます。

MNISTデータ

 それらのペアは、学習用に60,000個、検証用に10,000個の数だけ提供されています。

MNISTデータ
 ├ 学習用データ (60,000個)
 │  ├ 画像データ
 │  └ ラベルデータ
 │
 └ 検証用データ (10,000個)
    ├ 画像データ
    └ ラベルデータ

MNIST データの配布元とファイルについて

 そもそも MNIST のオリジナルデータはどこで配布されているかと言えば、MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges のホームページです。

ファイル

 MNIST データは、次の4つのファイルで構成されます。 役割ごとにファイルが分かれています。

  • train-images-idx3-ubyte: 学習用の画像セット
  • train-labels-idx1-ubyte: 学習用のラベルセット
  • t10k-images-idx3-ubyte: 検証用の画像セット
  • t10k-labels-idx1-ubyte: 検証用のラベルセット

MNISTデータの仕様

 MNIST のファイルをデータをダウンロードすると JPEG などの画像が入っているのかと思いきや、予想とは違い、次のような仕様のデータファイルが含まれていました。 1ファイルの中に複数の画像やラベルのデータが入っており、ファイルを読込む際にはその仕様に則る必要があります。 ただし、後述する各種ライブラリのクラス・関数を利用すれば簡単にデータを読込むことができます。

ラベルデータ (train-labels-idx1-ubyte / t10k-labels-idx1-ubyte)

 ラベルデータが保存されたファイル(train-labels-idx1-ubyte / t10k-labels-idx1-ubyte)は、次のような仕様になっています。

offset type value description
0000 32 bit integer 0x00000801(2049) 識別子(定数)
0004 32 bit integer 60000 or 10000 ラベルデータの数
0008 unsigned byte 0 ~ 9 1つ目のデータのラベル
0009 unsigned byte 0 ~ 9 2つ目のデータのラベル
.... .... .... ....
xxxx unsigned byte 0 ~ 9 最後のデータのラベル

ラベルは、画像が何の数字を表すかの 0 から 9 までの数値です。

画像データ (train-images-idx3-ubyte / t10k-images-idx3-ubyte)

 画像データが保存されたファイル(train-images-idx3-ubyte / t10k-images-idx3-ubyte)は、次のような仕様になっています。

offset type value description
0000 32 bit integer 0x00000803(2051) 識別子(定数)
0004 32 bit integer 60000 画像データの数
0008 32 bit integer 28 1画像あたりのデータ行数
0012 32 bit integer 28 1画像あたりのデータ列数
0016 unsigned byte 0 ~ 255 1つめの画像の1ピクセル目の値
0017 unsigned byte 0 ~ 255 1つめの画像の2ピクセル目の値
.... .... .... ....
xxxx unsigned byte 0 ~ 255 最後の画像の784ピクセル目の値

ピクセルの値は、0 から 255 までの値で、0 が白を, 255 が黒を表します。

各種ライブラリにおけるMNIST

 前述の通り MNIST データを使ったサンプル実装は、どんなライブラリでもチュートリアル的に行われます。 ここでは、各種ライブラリでの MNIST データ利用について解説します。

Tensorflow

 Google が開発しているオープンソースライブラリの Tensorflow には、MNIST データを利用したチュートリアルが含まれています。 パッケージとしては tensorflow.examples.tutorials.mnist で、ソースコードは GitHub で公開されています。

 MNISTのデータセットを利用したい場合は、次のように input_data を利用することで簡単に取得できます。 動き的には、ローカルに MNIST データがない場合はインターネットから取得するような動きをします。

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/mnist_data/", one_hot=True)

Keras

 Keras では、MNIST データセットを提供しています。 次のようなたった2行のコードで MNIST のデータセットを得ることができます。 Tensorflow 同様、ローカルに MNIST データがない場合はインターネットから取得するような動きをします。

 from keras.datasets import mnist
 (x_train, y_train), (x_test, y_test) = mnist.load_data()

Chainer

 Chainerでも、MNIST データセットを提供しています。 Keras 同様、ローカルに MNIST データない場合はインターネットから取得するような動きをします。

import chainer
train, test = chainer.datasets.get_mnist()

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。
個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca