MNIST:手書き数字の画像データセット:AI・機械学習のデータセット辞典
データセット「MNIST」について説明。7万枚の手書き数字の「画像+ラベル」データが無料でダウンロードでき、画像認識などのディープラーニングに利用できる。scikit-learn、Keras/tf.keras、TensorFlow、PyTorchにおける利用コードも紹介。
データセット解説
The MNIST database(Modified National Institute of Standards and Technology database)(以下、MNIST)は、「0」〜「9」の手書き数字の画像データセットである(図1、Yann LeCun氏/Corinna Cortes氏/Christopher J.C. Burges氏によって、手書き文字データセットのNISTデータベースから抽出&加工して作成されたサブセットである)。

図1 MNISTに含まれる「手書き数字」の例
※データセットの配布元: The MNIST database(Modified National Institute of Standards and Technology database)。ライセンス指定なし
MNISTは、主に画像認識を目的としたディープラーニング/機械学習の初心者向けチュートリアルでよく使われており、データがきれいに整形さているので「高い精度が出やすい」という特長がある(逆に言うと、MNISTでは精度が高すぎて、機械学習の手法間で精度を比較したい場合には使いづらいという欠点がある)。
MNISTデータセット全体は、
- 6万枚の訓練データ用(画像とラベル)
- 1万枚のテストデータ用(画像とラベル)
- 合計7万枚
で構成される(※「ラベル」=正解を示す教師データ)。各画像のフォーマットは
- 8bitグレースケール(=色がないモノクローム): 白「0」〜黒「255」の256段階
- 幅28×高さ28フィールド(=784フィールド)
となっている(※「フィールド」=データを画像化する場合には「ピクセル」に対応する。RGBで作るグレースケールでは、0が黒で、255が白となり逆なので注意してほしい)。
引用のための情報
このデータセットは、著作権はYann LeCun氏らが保有するが、基本的に自由に使用できる(※ライセンスは指定されていない。MNISTデータセットを提供するリポジトリが複数存在するが、基本的にCC(Creative Commons)の「パブリック・ドメイン・マーク」もしくは「CC BY-SA 3.0」ライセンスなどで提供されている)。
データセットを引用する際に使える、その他の情報を以下にまとめておく。
- 作成者: Yann LeCun, Corinna Cortes and Christopher J.C. Burges.
- タイトル: THE MNIST DATABASE of handwritten digits
- 公開日: Nov, 1998
- 論文: Y. Lecun, L. Bottou, Y. Bengio and P. Haffner, "Gradient-based learning applied to document recognition," in Proceedings of the IEEE, vol. 86, no. 11, pp. 2278-2324, Nov. 1998, doi: 10.1109/5.726791.
- URL: http://yann.lecun.com/exdb/mnist/
利用方法
実際にMNISTを使うには、scikit-learn/Keras/TensorFlow/PyTorchといった各ライブラリが提供する機能を利用することをお勧めする。というのも、MNISTの公式ページからダウンロード可能な、
- train-images-idx3-ubyte.gz: 訓練データ用の画像(6万枚)
- train-labels-idx1-ubyte.gz: 訓練データ用のラベル(6万枚)
- t10k-images-idx3-ubyte.gz: テスト用の画像(1万枚)
- t10k-labels-idx1-ubyte.gz: テスト用のラベル(1万枚)
という4つのファイルは、.jpgのような一般的な画像ファイルではなく、独自のフォーマットを持つ単一(=複数の画像データがひとまとめになった形式)の画像データセットだからである(※ファイルフォーマットの仕様は、公式ページの「FILE FORMATS FOR THE MNIST DATABASE」および「THE IDX FILE FORMAT」を確認してほしい)。
ライブラリを使わない場合、この画像フォーマットを読み込むためのリーダーをプログラムとして作る必要がある。プログラムの作成は難しくはないが、多くの人が使うものなので、主要な機械学習&ディープラーニングのライブラリでは基本機能としてMNISTをロードする機能が含まれている。よってそのロード機能を活用して、ムダな作業を減らすことを本稿ではお勧めする。
それぞれのライブラリで「どのようなコードを書くとMNISTが使えるか」の典型的なコードを簡単に示しておく(※コードの詳細は解説しない)。基本的に各ライブラリは、MNISTデータセットを自動的にダウンロードして使いやすい形にロードしてくれる機能を提供している。
scikit-learn
# ! pip install scikit-learn # ライブラリ「scikit-learn」をインストール
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784')
sklearn.datasets.fetch_openml()関数(※EXPERIMENTAL、つまり実験段階のAPI)を呼び出せばよい。この関数は、OpenML.orgからデータセットをフェッチ(=取得)するためのもので、リスト1では「OpenML mnist_784」をフェッチしている。
TensorFlow(tf.keras)/Keras
# !pip install tensorflow # ライブラリ「TensorFlow」をインストール
# !pip install keras # tf.kerasの場合は不要だが、Kerasを使う場合はライブラリ「Keras」をインストール
from tensorflow.keras.datasets import mnist # tf.kerasを使う場合(通常)
#from keras.datasets import mnist # tf.kerasではなく、Kerasを使う必要がある場合はこちらを有効にする
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
tf.keras.datasets.mnist.load_data()関数を呼び出せばよい。
TensorFlow Datasets
# !pip install tensorflow tensorflow-datasets # ライブラリ「TensorFlow」と「TensorFlow Datasets」をインストール
import tensorflow_datasets as tfds
mnist_train = tfds.load(name="mnist", split="train")
TensorFlow Datasetsで使用できるデータセットは、こちらのページにまとめられており、tensorflow_datasetsモジュール(=tfds)のtfds.load関数から利用できる。
PyTorch
# !pip install torch torchvision # ライブラリ「PyTorch」をインストール
import torch
import torchvision
mnist_data = torchvision.datasets.MNIST(
'./mnist', train=True, download=True,
transform=torchvision.transforms.ToTensor())
data_loader = torch.utils.data.DataLoader(mnist_data, batch_size=4, shuffle=True)
torchvision.datasetsクラスのコンストラクター(厳密には__init__関数)でデータセットのオブジェクトを生成してデータをダウンロードし、torch.utils.data.DataLoaderクラスのコンストラクターでデータローダーのオブジェクトを生成してデータをロードする。
Copyright© Digital Advantage Corp. All Rights Reserved.