===== (2)データの準備(Keras) =====
Keras2でMNIST目次\\
[[Kerasプログラミングの全体図]]
-[[(1)Kerasを使用するためのimport文]]
-[[(2)データ準備(Keras)]] <= いまココ
-[[(3)モデル設定(Keras)]]
-[[(4)モデル学習(Keras)]]
-[[(5)結果の出力(Keras)]]
-[[(6)学習結果の保存(Keras)]]
-[[(7)推測(Keras)]]
以下のような流れになります。Numpy配列についての知識が必要です。Numpy配列については、[[http://twosquirrel.mints.ne.jp/?p=20153|Chainer用の画像処理メモ(5)初めてのNumPy"import numpy as np"]]と[[http://twosquirrel.mints.ne.jp/?p=20209|Chainer用の画像処理メモ(6)画像をNumpy配列に変換]]をご覧いただければ幸いです。
#2 データ準備(Keras)
image_list = []
label_list = []
# 画像を読み込み、リサイズ、正規化などを行い、
# Numpy配列に変換し、「学習用データ」と「テストデータ」を作成する。
X_train, X_test, y_train, y_test = train_test_split(image_list, label_list, test_size=0.33, random_state=111)
自前データを利用する場合に最も大事な部分であり、最初は、かなりとっつきにくい部分となります。
具体的な方法について興味のある方は[[Keras2用自前データの準備]]をご覧ください。
今回は一番最初のチュートリアルなので、以下のようにKerasが用意しているMNISTデータセット(画像ではなく、既に数値の配列に変換されているもの)を用いて行います。
(MNISTデータを用いるときしかできません。自前データを利用する場合は真似できない方法であり、あくまでチュートリアル用の方法です。)
#2 データ準備(Keras)(MNISTの場合)
# Kerasが用意しているMNISTデータセットをダウンロードしてx_train, y_train, x_test, y_testに代入
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
===== 開発環境 =====
Windows 8.1\\
Anaconda \\
Python 3.5\\
Tensorflow 1.4\\
Keras 2.0.9\\
Keras2.0のインストール方法は[[windowsにkeras2.0をインストール]]をご覧下さい。
このページは、[[(1)Kerasを使用するためのimport文]]の続きであり、今回は、MNISTのデータの準備・設定を行っていきます。
データの準備が難しいところなのですが、今回は、最初なので、Kerasであらかじめ用意されているMNISTデータセットを利用します。
オリジナルデータセットの準備については、後日、[[Keras2用自前データの準備]]に記載予定です。
===== 手順 =====
==== 0. 前回終了時の画面 ====
[[(1)Kerasを使用するためのimport文]]終了時の、以下のような状態から始めます。
{{:pasted:20171106-042357.png}}
==== 1. データセットの準備 ====
以下のコードを入力して、Shift + Enterを押します。最初は、MNISTの画像データなどがダウンロードされるので、時間がかかります。
#2 データ準備(Keras)(MNISTの場合)
# Kerasが用意しているMNISTデータセットをダウンロードしてx_train, y_train, x_test, y_testに代入
# https://keras.io/ja/datasets/ を参照
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
# matplotlibを使ったグラフ描画結果がnotebook内に表示されるようにします。
%matplotlib inline
import matplotlib.pyplot as plt
# データの例示
x = x_train[0]
t = np.argmax(y_train[0])
plt.imshow(x.reshape(28, 28), cmap='gray')
plt.show()
print('label:', t)
以下のような画面になります。(以下の画面は、2回目以降の画面となります。最初は、「Downloading from %%http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...%%」といった感じの文字が4行続くかもしれません。)
{{:pasted:20171106-051156.png}}
{{:pasted:20171106-051215.png}}
順に解説していきます。
#2 データ準備(Keras)(MNISTの場合)
# Kerasが用意しているMNISTデータセットをダウンロードしてx_train, y_train, x_test, y_testに代入
# https://keras.io/ja/datasets/ を参照
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
Kerasが用意しているkeras.datasetsから、手書き数字MNISTのデータをダウンロードして読み込みます。
MNISTとは何か、またこれから何をやろうとしているのかについては、以下のサイトが非常に分かりやすいです。\\
http://exceldeeplearning.blog.jp/archives/1411297.html\\
ちなみに、よく言われているMNISTの元データのダウンロードついては、[[http://twosquirrel.mints.ne.jp/?p=20277|こちら]]をご覧いただければと思います。ただ、上記サイトのデータも、画像が既に数値の配列に変換されたものであるので、画像をダウンロードしたい場合は、サンプル数などは少し異なりますが、[[http://twosquirrel.mints.ne.jp/?p=20494|手書き数字MNISTのjpgファイル群をダウンロードする方法]]をご覧頂ければ幸いです。
手書き数字MNISTは、本来は28x28pixelのグレースケールの画像と、それが何の数字であるかの正解ラベルのセットです。この画像と正解ラベルのセットが、training用の6万セット、test用の1万セットとなっています。
ただ、画像のままではKerasでは読み込めません。そのため、画像を0~255の値をとる784個の数字が1列に並んだ配列に変換(reshape(60000, 784))し、さらに正規化といって全部255で割ったたものをx_trainに代入しています。\\
さらに、以下のコードで、正解ラベルをone hot ベクトルに変換したものを、y_trainに代入しています。
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
具体的には、今回、
print(x)
print(t)
と入力してShift + Enterで実行すると、以下のように表示されてます。
{{:pasted:20171106-053503.png}}
{{:pasted:20171106-053530.png}}
{{:pasted:20171106-054412.png}}
xは、1x784のNumpy配列(各要素は0から1までの数値(dtype=float32))であり、tは正解ラベル(dtype=int32)となっています。
コードの解説に戻ります。\\
次は、x_train[0]の画像データをJupyter Notebookで可視化しています。
# matplotlibを使ったグラフ描画結果がjupyter notebook内に表示されるようにする。
%matplotlib inline
import matplotlib.pyplot as plt
# データの例示
# x_trainデータセットの1行目、つまり、画像データのNumpy配列(1x784)をxとして取り出す
x = x_train[0]
# y_trainの正解ラベル(one-hot表現のベクトル)の1行目を取り出し、numpyのargmax関数で数値として取り出す
# 今回は正解ラベルのインデックスが、そのまま、数字0や1のラベルとなっている。
t = np.argmax(y_train[0])
# 1x784のNumpy配列xを、28x28のNumpy配列に変換後、matplotlibのpyplotを用いて、
# グレースケール画像として読み込み、Jupyter Notebook内で表示
plt.imshow(x.reshape(28, 28), cmap='gray')
plt.show()
# 正解ラベルの表示
print('label:', t)
こちらは、ダウンロードしたMNIST画像の1つを、Jupyter Notebook上に表示して確認しています。一つ一つのコードについては、上記のコード内にコメントで記載しました。ここでは、Numpyのreshape()関数と、matplotlib.pyplotのimshow()関数、show()関数を用いています。numpyとmatplotlibは機械学習プログラミングでよく使いますので、特にNumpyについては勉強しておく必要があります。
Numpyについては、[[http://twosquirrel.mints.ne.jp/?p=20153|Chainer用の画像処理メモ(5)初めてのNumPy"import numpy as np"]]をご覧いただければ幸いですが、pythonで機械学習を行うためには必須事項ですので、[[http://amzn.to/2zeJ7Lz|ゼロから作るDeep Learning]]などの本を読んで繰り返し写経して、ある程度しっかり勉強しておく必要があります。
後半のコードは、特にMNISTのtrainingを行う際には不要ですが、データを読み込んだときに、読み込んだデータと元のデータとの整合性の検証は大事なことなので、このようなコードを記載しました。
Kerasが用意しているMNISTデータセットを用いる手順は上記でおしまいです。
初めての場合は、次は、とりあえず、[[(3)モデル設定(Keras)]]に進んでください。
===== keras.datasets.mnist.load_data()関数について =====
trainとtestに対応する2つのdatasetを返します。
(1)グレースケール画像のデータをgetする場合\\
今回はそれにあたります(MNISTなんてグレースケールで十分)が、
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
のように、x_trainとx_testに、画像データをNumpy配列に変換済みのものを代入し、y_trainとy_testに対応する正解ラベルを代入します。
(2)もともとのデータセットがグレースケール画像のデータとなっています。
Keras関連の関数については、公式マニュアルを読むのが一番です。日本語もあります!公式マニュアルが比較的読みやすいです。
https://keras.io/ja/datasets/#mnist\\
{{:pasted:20171106-052812.png}}
===== one-hotエンコーディング について =====
たとえば、正解ラベルが0,1,2, ..., 9 と10個あったときに、
0 => [1, 0, 0, 0, 0, 0, 0 ,0, 0, 0]
1 => [0, 1, 0, 0, 0, 0, 0 ,0, 0, 0]
2 => [0, 0, 1, 0, 0, 0, 0 ,0, 0, 0]
...
9 => [0, 0, 0, 0, 0, 0, 0 ,0, 0, 1]
のように、数値をベクトルで表現することを、one-hot エンコーディングといいます。
機械学習の計算では、コンピュータに行列計算をさせることが多い(だからGPUをうまく使用すると計算スピードが速くなる)ので、正解ラベルもベクトルで表現しておくと都合がよいらしいです。コンピュータに効率良く計算させるために、ミニバッチ学習とか、プログラミング的には面倒なだけで意味不明なことをやっていたりするという噂を聞いたりしたことがあります(まだちゃんと理解していません、間違っていたらすみません、、、)。
ちなみに、one-hotベクトルを、通常のラベルに戻すときには、Numpyのargmax()関数を利用して、one-hotベクトル(=配列)の、最大要素のインデックスを取り出して、数値に戻します。具体的な方法は、[[Keras2用自前データの準備]]に記載予定です。
2016-11-08 Kerasによる多クラス分類(Iris)
http://aidiary.hatenablog.com/entry/20161108/1478609028
===== 参考文献 =====
初めてKerasプログラミングをやるときの超おすすめ本。\\
===== リンク =====
次 [[(3)モデル設定(Keras)]]
前 [[(1)Kerasを使用するためのimport文]]
Keras2でMNIST目次\\
[[Kerasプログラミングの全体図]]
-[[(1)Kerasを使用するためのimport文]]
-[[(2)データ準備(Keras)]]
-[[(3)モデル設定(Keras)]]
-[[(4)モデル学習(Keras)]]
-[[(5)結果の出力(Keras)]]
-[[(6)学習結果の保存(Keras)]]
-[[(7)推測(Keras)]]