Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

2020/2更新

内容が若干古くなったため、個人ブログにリライトしました。
https://kakedashi-engineer.appspot.com/2020/02/10/mnist/

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を使っているようだ。

tsal3290s
機械学習に興味があります
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away