MNIST:手書き数字の画像データセットAI・機械学習のデータセット辞典

データセット「MNIST」について説明。7万枚の手書き数字の「画像+ラベル」データが無料でダウンロードでき、画像認識などのディープラーニングに利用できる。scikit-learn、Keras/tf.keras、TensorFlow、PyTorchにおける利用コードも紹介。

» 2020年01月22日 05時00分 公開
[一色政彦デジタルアドバンテージ]
「AI・機械学習のデータセット辞典」のインデックス

連載目次

データセット解説

 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に含まれる「手書き数字」の例 図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が白となり逆なので注意してほしい)。

図2 MNISTに含まれる画像データの内容 図2 MNISTに含まれる画像データの内容

引用のための情報

 このデータセットは、著作権はYann LeCun氏らが保有するが、基本的に自由に使用できる(ライセンスは指定されていない。MNISTデータセットを提供するリポジトリが複数存在するが、基本的にCC(Creative Commons)の「パブリック・ドメイン・マーク」もしくは「CC BY-SA 3.0」ライセンスなどで提供されている)。

 データセットを引用する際に使える、その他の情報を以下にまとめておく。

利用方法

 実際に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')

リスト1 scikit-learnでMNISTを利用する基本的なコード

 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()

リスト2 Keras/tf.kerasでMNISTを利用する基本的なコード

 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")

リスト3 TensorFlow DatasetsでMNISTを利用する基本的なコード

 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)

リスト4 PyTorchでMNISTを利用する基本的なコード

 torchvision.datasetsクラスのコンストラクター(厳密には__init__関数)でデータセットのオブジェクトを生成してデータをダウンロードし、torch.utils.data.DataLoaderクラスのコンストラクターでデータローダーのオブジェクトを生成してデータをロードする。

「AI・機械学習のデータセット辞典」のインデックス

AI・機械学習のデータセット辞典

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。