Python
DeepLearning
MNIST
sklearn

PythonでMNISTを利用する方法まとめ

More than 1 year has passed since last update.


MNISTとは


概要

MNISTは28×28ピクセルの手書き数字のデータセット。

Deep Learning界隈の人は、とりあえずベンチマークとして使うことが多い。

各ピクセルは0から255の整数値をとる。

画像は全部で7万枚あり、内訳はtraining dataが6万枚、test dataが1万枚。

最初からtraining dataとtest dataが分かれているのがポイント。

これをそのまま使うこともあるが、

training dataのうち、後ろから1万枚をvalidation dataとして使うこともある。

(validation dataって何ぞ、って人はearly stoppingでググりましょう)


データの順番

データは各クラスごとに並んでいるわけではなく、

たとえばtraining dataなら

[5 0 4 ..., 8 4 8]

のように規則性のない順番になっている。


各数字の割合

ちょっと注意したいのが、各数字の割合。

当然、各数字6000+1000枚ずつだと思っていたのだが、調べてみると違うようだ。

"1"の画像は"5"の画像より24%も多いではないか・・・

    0      1     2       3      4      5      6      7      8      9

[ 5923. 6742. 5958. 6131. 5842. 5421. 5918. 6265. 5851. 5949.] # training data
[ 980. 1135. 1032. 1010. 982. 892. 958. 1028. 974. 1009.] # test data
[ 6903. 7877. 6990. 7141. 6824. 6313. 6876. 7293. 6825. 6958.] # training data + test data


正規化

もう1つ注意したいことがある。

画像の隅にあたるピクセルは、7万枚のどの画像でも0になっていたりする。

そのため、正規化をピクセルごとに行おうとすると、ゼロ除算が発生してしまう。

サンプルコードなどでは、numpy等で一括して255.0で割ってしまうのが一般的なようだ。

前置きが長くなりました。続いて、MNISTをPythonで利用する方法を簡単に紹介。


1. THE MNIST DATABASE of handwritten digits(本家)

Yann LeCunさんらのホームページからダウンロードすることができます。

train-images-idx3-ubyte.gz: training set images (9912422 bytes)

train-labels-idx1-ubyte.gz: training set labels (28881 bytes)

t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)

t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

テキストデータではなくバイナリデータなので適当に処理を施して使う。

見ての通りですが、training dataとtest dataに分かれており、さらにラベルも別になっている。

ちなみに、ラベルは0~9の整数値なので、1-of-K表現にしたいって人が多いのではないかと思う。

そんなときは、sklearn.preprocessing.LabelBinarizerがオススメ。


2. sklearn

sklearnではダウンロードの必要なしで、以下のベンチマークなら簡単に呼び出せる。

from sklearn.datasets import *

load_boston()
load_iris()
load_diabetes()
load_digits([n_class])
load_linnerud()

しかし、それだけではなくmldata.orgという機械学習データのためのリポジトリから、

データをダウンロードすることもできる。ここにはMNISTもある。

データが重いのでダウンロードには少し時間がかかりますが、

一度ダウンロードすればdata_homeに保存されるので、二回目はそこまで待たなくて済む。

from sklearn.datasets import fetch_mldata

mnist = fetch_mldata('MNIST original', data_home=custom_data_home)

非常に簡単に使える。


3. その他

TensorFlowやTheanoなどのライブラリでは、独自にMNISTをダウンロードする関数があるようだ。

サンプルコードを見れば使い方は大体わかると思う。chainerではsklearnを使っているようだ。