MNIST データの仕様を理解しよう¶
人工知能・機械学習の勉強をしていると、チュートリアル的なサンプルデータとして頻繁に登場するのが MNIST のデータです。 たしかにとても使い勝手がよく重宝するデータだと思いますが、そもそもどんな仕様のデータなのか、そのデータ構造については理解しておく必要があります。 ここでは MNIST データの仕様についてまとめてみたいと思います。
MNIST データとは?¶
MNISTのデータは、手書きで書かれた数字を画像にした画像データ(image)と、その画像に書かれた数字を表すラベルデータ(label)から構成されます。
それらのペアは、学習用に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()