はじめに
第1章 MNIST
第2章 深層学習 -PyTorch-
第3章 手書き判定GUI
おわりに
著者紹介
本書をご覧いただきありがとうございます。この本は、機械学習のお試しデータセットとして広く世の中に使われているMNISTデータセットに着目した内容になっています。この本を読んで試しにプログラムを動かしてみることで、初学者の方がMNISTについて興味を持っていただくと共に、深層学習ライブラリとして公開されているPyTorchを活用し、深層学習でどんなことができるのかを知ってもらうための入り口となればと思っています。また付随して、深層学習の動作をGUIアプリ上で動かしてみることにより、Pythonを活用した簡易なGUIアプリ創作にも興味を持っていただければと思います。
MNISTデータセットを活用した深層学習モデルの実装や取り組みはウェブ上の至る所で行われており、検索するとさまざまな面白い取り組みを見つけることができると思います。私自身も深層学習を学んでいく上で参考にした取り組みも多くありましたが、一方でそれらの参考情報がウェブ上に散逸しているようにも感じました。そこで、MNISTと深層学習というカテゴリで、これらの情報を自分なりに整理し、深層学習の初学者の方に役立てたいと思ったことがこの本を書いたモチベーションです。文章にお見苦しい点もあるとは思いますが、最後までご覧いただけると幸いです。
下記に各章の概要について示します。
<第一章>
MNISTがどのようなデータセットなのか、またMNISTから派生したデータセットについて解説します。
<第ニ章>
深層学習ライブラリPyTorchにより、さまざまなタスク(分類、回帰、AutoEncoder、GAN、CAM、Segmentation)をMNISTのデータセットを活用して実際に動かしてみることに取り組みます。
<第三章>
実際に、任意で描画した手書き数字を深層学習で判定する簡易的なGUIアプリを作成します。
本章では機械学習を試すデータセットとして著名なMNISTについて、その成り立ちや具体的なデータの中身について解説します。またウェブ上ではMNISTに関連する派生データセットも多数公開されており、これらのデータセットについても紹介します。
MNISTは「0」〜「9」の手書き数字が描かれた画像を集めた大規模なデータセットです。入力画像から何の数字を示しているか分類する画像分類問題のデータセットとして人気が高く、深層学習の入門データセットとしてよく使用されています。
名称に関しては主にMNIST(エムニスト)と呼ばれていますが、正式名称は「Mixed National Institute of Standards and Technology database」です。翻訳すると「国立標準技術研究所混合データベース」となりますが、これだとデータベースの出処しか分からずデータの中身に何が含まれているのか少し分かりにくいですね。MNISTは、手書きの数字「0」~「9」の画像で構成されるデータセットであると理解すればよいと思います。
このMNISTデータは、1998年にアメリカ国立標準技術研究所=NIST(National Institute of Standards and Technology)のYann LeCunさん達の手によって作成されました。データの内容や詳細については後述しますが、データの数量としては訓練用データが60000枚、テスト用データが10000枚、合計70000枚の画像で構成されたデータセットです。またデータセットの特徴として、画像サイズは固定で、手書き文字が画像の中心に位置するように正規化されていることが挙げられます。
作者Yann LeCunさん達が公開しているサイトは、こちらのURL(http://yann.lecun.com/exdb/mnist/)です。サイト上には上記で述べた訓練データ、テストデータが.gz形式のファイルとして、以下のリストのように画像とラベルデータが計4種類に分かれて提供され、ダウンロードが可能になっています。バイナリ形式のため、解凍しただけでは画像やラベルは確認できないのでご注意下さい。
<公式サイトよりダウンロード可能なMNISTデータリスト>
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)
次章ではPyTorchライブラリを使用して、MNISTの中身を確認します。まずデータの中身を実際に見てみたいと思われる方は、次章をご覧ください。
ここでは具体的なMNISTデータセットの中身について確認していきます。既に述べた通り、MNISTは「0」〜「9」の手書き数字の画像データで構成されています。図1.1に実際の各数字の画像データの一部の例を示します。紙面上は大きく見えるかもしれませんが、実際のデータとしての画像サイズは28×28ピクセルの小さい正方形の白黒画像で表現されています。MNISTデータセットでは各画像に合わせてどの数字に該当するかを示す「0」~「9」の正解ラベルデータも存在しています。
MNISTの訓練用データ、テスト用データの内訳を表1.1に示します。ここでいう訓練用データとは学習に使用するデータ、テスト用データは学習ではなく評価に使用するデータを意味しています。訓練用データとテスト用データはそれぞれデータを集めた抽出元が2箇所存在しており、同じ数量の訓練用データとテストデータがそれぞれの場所から抽出されています。抽出元と振り分けの内訳を以下の表に示します。MNISTについて記述されている論文には、データ抽出先①の「米国勢調査局職員」の文字は、一方のデータ抽出先②の「高校生」達と比較すると文字がきれいで認識しやすいと述べられています。それを踏まえて、訓練用データとテスト用データは混合して構成されたようです。
データ抽出元 | 訓練データ [枚数] | テストデータ [枚数] |
①米国勢調査局職員 | 30000 | 5000 |
②高校生 | 30000 | 5000 |
(①+②)合計 | 60000 | 10000 |
また「0」~「9」までの数字の各ラベルに対する訓練用データとテスト用データの枚数は以下の表1.2の通りです。含まれている数字は同数ではなく、枚数にばらつきが存在しています。ただし訓練用とテスト用どちらも、ラベル毎のデータ枚数の割合はほぼ同じに調整されています。例えば「0」のラベルに着目すると訓練用データの全体に対する割合は5923/60000=9.87%、テスト用データは980/10000=9.80%となり割合がほぼ同じになっています。またデータ数の最大最小に関しては最も多いラベルは「1」で、逆に最も少さいラベルは「5」のようです。最大最小のラベルのデータ数を比べると、訓練用データだと約1300枚近く枚数差があります。
MNISTデータセットのもうひとつの特徴としては、手書き文字の著者数に関する情報を持っていることがあります。著者数は訓練用データ:250名、テスト用データ:250名に分かれて収集されており、訓練用とテストデータに同じ著者は存在しない構成となっています。
ラベル | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
訓練用 | 5923 | 6742 | 5958 | 6131 | 5842 | 5421 | 5918 | 6265 | 5851 | 5949 |
テスト用 | 980 | 1135 | 1032 | 1010 | 982 | 892 | 958 | 1028 | 974 | 1009 |
MNISTの画像分類性能について、データセット作成者のYann LeCunさん達のサイトでは各機械学習モデルにおけるMNISTのテストデータに対する分類性能の研究成果も公開されています。例えばConvolutional nets(畳み込み層を使ったニューラルネットワーク)における最新の2012年の結果を確認すると、テストデータに対して99.77%の割合で画像の分類に成功しています。
またニューラルネット以外の機械学習手法での分類性能の結果が公開されており、2002年と少し古い結果ではありますがSVM(Support Vector Machine)を活用した結果もあります。しかしながらSVMの手法では99.44%と0.33%低い値であり最新のニューラルネットの結果の方が良い性能を出しています。
いろいろと結果を眺めていると、1998年に発表された層が少ない2層のニューラルネット(隠れ層が300ユニットのモデル)では95.3%の分類性能であるなど、過去の段階ではニューラルネットワークモデルは他の手法に比べて見劣りしています。しかしながら近年での結果を見ると、より多層にしたり畳み込み層を追加する等モデルの変化によって改善されていることが確認できることから、現在のニューラルネットモデルの急激なパフォーマンス向上を表していることがうかがえます。
下記表1.3にはYann LeCunさんのサイトから一部引用し、各手法における最新の結果をまとめたものを示します。Test Error Rateでの表記のため、分類成功率ではなく失敗率を示しています。そのため、値が小さい方が分類性能が良い手法となります。
手法 | モデル詳細 | Test Error Rate (%) | 発表年 |
Linear Classifers | pairwise linear classifier | 7.6 | 1998 |
K-Nearest Neighbors | K-NN, shape context matching | 0.63 | 2002 |
Boosted Stumps | product of stumps on Haar f. | 0.87 | 2009 |
Non-Linear Classifers | 1000 RBF + linear classifier | 3.6 | 1998 |
SVMs | Virtual SVM, deg-9 poly, 2-pixel jittered | 0.56 | 2002 |
Neural Nets | deep convex net, unsup pre-training [no distortions] | 0.83 | 2010 |
Convolutional Nets | committee of 35 conv. net, 1-20-P-40-P-150-10 [elastic distortions] | 0.35 | 2012 |