覚え書きブログ

Pythonによる機械学習4(ニューラルネット応用 3/4)

<< Pythonによるデータ解析4(ニューラルネット応用 2/4)

【Pythonによる機械学習4(ニューラルネット応用 3/4)の目次】

手書き文字画像の分類

画像分類の題材として、手書き文字画像のMNISTを用います。MNISTにおける課題は、以下のような28 x 28ピクセルの手書き数字の画像を、0~9までの10種類のカテゴリに分類することです。また、学習データ数と評価データ数はそれぞれ60000と10000枚あります。
f:id:hirotaka_hachiya:20171206004924p:plain

画像特徴量の抽出

文章と同様に画像を、機械学習のアルゴリズムに入力するために、特徴量ベクトルに変換する必要があります。代表的な画像特徴量としてはSIFT、Super vectorおよびFisher vectorなどがあります。
f:id:hirotaka_hachiya:20171206005617p:plain
しかしながら、近年は、画像の特徴抽出をニューラルネットワークの一部として実現する畳み込みニューラルネットワーク(CNN: Convolutional Neural Network)を用いるのが主流となっています。CNNでは、以下のように、特徴抽出用と識別用との2つのニューラルネットワークを連結して共通の損失関数を最小化することにより、分類において重要な画像特徴を抽出するモデルパラメータを学習します。
f:id:hirotaka_hachiya:20171206010543p:plain

CNNの詳細については、以下を参照してください。

人工知能 第9回 ニューラルネットワークの応用

今回は、画像の解像度が28x28と小さいため、特に特徴抽出は行わずそのまま28x28=784次元の入力ベクトルとして扱うことにします。

学習と評価データの準備

以下から、MNISTの学習データと評価データをダウンロードし、intelligentSystemTraining下のMNISTフォルダに置いてください。
http://yann.lecun.com/exdb/mnist/

> ls MNIST
t10k-images-idx3-ubyte.gz  train-images-idx3-ubyte.gz
t10k-labels-idx1-ubyte.gz  train-labels-idx1-ubyte.gz

そして、data.MNISTクラスを用いてデータを読み込み、表示してみます。

>>> import data

# MNISTクラスのインスタンス化
>>> myData = data.MNIST()

# xTrainとxTestのサイズ
>>> myData.xTrain.shape
(784, 60000)

>>> myData.xTest.shape
(784, 10000)

# tTrainとtTestのサイズ
>>> myData.tTrain.shape
(10, 60000)
>>> myData.tTest.shape
(10, 10000)

# 学習データの0から9番目までの画像を表示する(ウィンドウを閉じると次の画像が表示)
>>> myData.plotImg(range(0,10),isTrain=True)

# 評価データの0から9番目までの画像を表示する(ウィンドウを閉じると次の画像が表示)
>>> myData.plotImg(range(0,10),isTrain=False)

以下のような学習と評価用の画像が表示されます。
f:id:hirotaka_hachiya:20171206000506p:plain

Pythonによる機械学習4(ニューラルネット応用 4/4) >>