データセット「QMNIST」について説明。MNISTを改良してテストデータを1万から6万に増やし、合計12万枚となった手書き数字の「画像+ラベル」データが無料でダウンロードでき、画像認識などのディープラーニングに利用できる。PyTorchにおける利用コードやTensorFlowにおける情報も紹介。
QMNISTデータセット(以下、QMNIST)は、
といった手書き数字の画像データセットである(図1)。
QMNISTは、MNISTの改良版/再構築版として、NIST Special Database 19から抽出&加工して作られたサブセットである。MNISTの代わりとして、主に画像認識を目的としたディープラーニング/機械学習の研究や初心者向けチュートリアルで使われることが想定される。
中身の画像データやラベルはMNISTデータセット(以下、MNIST)とほぼ同じであるが、
が異なる。
まず6万件に増やした理由については、論文「Cold Case: The Lost MNIST Digits」(2019年、arXiv:1905.10498)やFacebook AI Research(FAIR)が公開するGitHub上のqmnist公式サイトで、次のように言及されている。
The official MNIST testing set only contains 10K randomly sampled images and is often considered too small to provide meaningful confidence intervals.
(訳:公式のMNISTにおけるテストデータは、ランダムサンプリングされた1万枚の画像しか含まれておらず、(統計的に)意味のある信頼区間を提供するには小さすぎる、と多くの場合、考えられる。)
次にラベルに情報を付加した理由については、元のMNISTでは、データセット作成時の前処理に関する情報は失われているためとしている。例えば数字画像に対する筆者IDの情報が失われているので、そういった関係付けを行うための信頼できる方法がない、という問題があるのだ。
こういった2点を念頭にデータセットを改良するために、QMNISTでは元のMNIST論文に従い、データセットをゼロから再構築している。しかも、ハンガリアン法(Hungarian algorithm)を用いて元のMNISTの数字と可能な限り一致するように工夫している。図2は公式GitHubリポジトリの説明画像を引用したものであるが、MNIST(左)とQMNIST(右)の数字がほぼ完全に一致していることが分かるだろう。
まとめると、QMNISTデータセット全体は、
で構成される(※「ラベル」=正解を示す教師データ)。各画像のフォーマットは
となっている(※「フィールド」=データを画像化する場合には「ピクセル」に対応する。RGBで作るグレースケールでは、0が黒で、255が白となり逆なので注意してほしい)。
ラベルについては、数字に対応する0〜9の数値だけでなく、前述したようにオリジナルのNIST関連情報も付加されている。QMNISTのラベルは、表1に示す1次元テンソル(=ベクトル)のデータ形式となっている。
列インデックス | 説明 | 数値範囲 |
---|---|---|
0 | 文字分類 (Character class) |
0〜9 |
1 | NIST HSFシリーズ (NIST HSF series) |
0か、1か、4 |
2 | NIST筆者ID (NIST writer ID) |
0〜610 もしくは 2100〜2599 |
3 | この筆者における数字インデックス (Digit index for this writer) |
0〜149 |
4 | NIST分類コード (NIST class code) |
30〜39 |
5 | NIST全体における数字インデックス (Global NIST digit index) |
0〜281769 |
6 | 複製 (Duplicate) |
0 |
7 | 未使用 (Unused) |
0 |
表1 ラベルのデータ形式 |
通常は列インデックス0の値だけを見ればよいだろう。ちなみに[NIST HSFシリーズ]とは、大本のNISTがhsf0〜hsf4で管理されているため。[NIST筆者ID]は、0〜2099がNIST従業員で、2100〜2599が高校生を意味する。このような情報は、公式サイトや論文の「MNIST trivia」などに記載されているので、詳しくはそちらを参照してほしい。
このデータセットは、基本的に自由に使用できる(※BSDライセンス。厳密には公式リポジトリを確認してほしい)。
引用情報を以下にまとめておく。
実際にQMNISTを使うには、PyTorch(や将来的にはTensorFlow)といった各ライブラリが提供する機能を利用することをお勧めする。というのも、QMNISTの公式ページからダウンロード可能な、
という4つのファイルは、.jpgのような一般的な画像ファイルではなく、独自のフォーマットを持つ単一(=複数の画像データがひとまとめになった形式)の画像データセットだからである(※ファイルフォーマットの仕様は、MNIST公式ページの「FILE FORMATS FOR THE MNIST DATABASE」および「THE IDX FILE FORMAT」を確認してほしい)。
ライブラリを使わない場合、これらの画像フォーマットを読み込むためのリーダーをプログラムとして作る必要がある。プログラムの作成は難しくはないが、多くの人が使うものなので、一部の機械学習&ディープラーニングのライブラリでは基本機能としてQMNISTをロードする機能が含まれている(※QMNISTは2019年と最近登場したものであり、2020年10月12日時点で、まだPyTorchにしか標準実装されていない。TensorFlowにも実装される見込みなので後述する)。よってそのロード機能を活用して、ムダな作業を減らすことを本稿ではお勧めする。
それぞれのライブラリで「どのようなコードを書くとQMNISTが使えるか」の典型的なコードを簡単に示しておく(※コードの詳細は解説しない)。基本的に各ライブラリは、QMNISTデータセットを自動的にダウンロードして使いやすい形にロードしてくれる機能を提供している。
# !pip install torch torchvision # ライブラリ「PyTorch」をインストール
import torch
import torchvision
train_data = torchvision.datasets.QMNIST(
'./QMNIST/train',
train=True, download=True, transform=torchvision.transforms.ToTensor())
test_data = torchvision.datasets.QMNIST(
'./QMNIST/test',
train=False, download=True, transform=torchvision.transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_data, batch_size=4, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=4, shuffle=True)
PyTorchでは、torchvision.datasets.QMNISTクラスのコンストラクター(厳密には__init__関数)でデータセットのオブジェクトを生成してデータをダウンロードし、torch.utils.data.DataLoaderクラスのコンストラクターでデータローダーのオブジェクトを生成してデータをロードすればよい。ラベルデータは、元のMNISTのように数値のみではなく、前述した通り8つの列フィールドを持つ1次元テンソルとなっているので注意してほしい。
TensorFlowでは、TensorFlow DatasetsへのQMNIST搭載が提案されており、実装コードがプルリクエストされレビューされている段階である。近い将来、正式に採用されると期待してよいだろう。具体的な情報や最新の情報は下記のリンク先を参照してほしい。
Copyright© Digital Advantage Corp. All Rights Reserved.