ラベル python の投稿を表示しています。 すべての投稿を表示
ラベル python の投稿を表示しています。 すべての投稿を表示

2017年6月3日土曜日

Jupiter Notebook + Keras(Tensor Flow)でチュートリアルをしてみる3 MINIST

Kerasチュートリアル第3弾。

機械学習のモデルを評価する時によく使われる、MINIST(手書き文字の認識をする)問題のコードを追っていく。
解説している記事をみながら、コードを追ってみる。

使う画像のサイズは28 x 28ピクセル。
60000イメージはモデル構築のために、10000イメージはテストのために使う。

いいモデルはエラー率1%以下になるらしい。

では実際にコードを見ていく。

実際の文字イメージ画像群(データセット)をダウンロードする必要があるが、Kerasでは便利なスクリプトが用意されているらしい。(~/.keras/datasets/mnist.pkl.gz にダウンロードされる)

以下はダウンロードしてプロットするスクリプト。

# Plot ad hoc mnist instances
from keras.datasets import mnist
import matplotlib.pyplot as plt
# load (downloaded if needed) the MNIST dataset
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# plot 4 images as gray scale
plt.subplot(221)
plt.imshow(X_train[0], cmap=plt.get_cmap('gray'))
plt.subplot(222)
plt.imshow(X_train[1], cmap=plt.get_cmap('gray'))
plt.subplot(223)
plt.imshow(X_train[2], cmap=plt.get_cmap('gray'))
plt.subplot(224)
plt.imshow(X_train[3], cmap=plt.get_cmap('gray'))
# show the plot
plt.show()


ふむ、Jupiter Notebook上でも綺麗に表示された。

ではデータはダウンロードされたので、今回使うライブラリたちを読み込む。
Dropoutというのは、過学習を避けるためにランダムに伝播をさせずに、ネットワークをFatにさせないテクニックらしい。
詳しい論文

keras.unilsはその名の通り、kerasの便利クラス。モデルのシリアライズしたりするメソッドがある。https://keras.io/utils/


import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.utils import np_utils



前回と同じように、再現性を持たせるためにseedをセット。

# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)



でMINISTのデータを読み込む

# load data
(X_train, y_train), (X_test, y_test) = mnist.load_data()


読み込んだトレーニングセットは3次元の配列(白黒の場合)だが、モデルに食わせるためには、Vector(1次元の配列)にする必要があるらしい。28 x 28の画像だから784要素の配列する。

# flatten 28*28 images to a 784 vector for each image
# print(type(X_train))
num_pixels = X_train.shape[1] * X_train.shape[2] # 28 * 28
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32') # 60000 , 784
# 784要素のArrayが60000個ある2次元配列になった。
# print(X_train.shape)
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')


グレースケールは0 to 255で表しているが、これを255で割って0 to 1のスケールにする。

# normalize inputs from 0-255 to 0-1
X_train = X_train / 255
X_test = X_test / 255


教師データのラベルは0,1,2,3と正解の数値で表されているが、これを
0だったら [1,0,0,0,0,0,0,0,0,0]
5だったら [0,0,0,0,1,0,0,0,0,0]
と表すように変換する。

# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]


ついにモデルの定義をする。
1層目は入力784、出力784
2層目は入力784、出力10、活性化関数にsoftmaxを使っている。ざっくり言うと出力を確率に変えてくれるらしい。

損失関数はcategorical_crossentropy = Logarithmic loss


# create model
model = Sequential()
model.add(Dense(num_pixels, input_dim=num_pixels, 
                kernel_initializer='normal', activation='relu'))
model.add(Dense(num_classes, kernel_initializer='normal', activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy', 
              optimizer='adam', metrics=['accuracy'])


データを与えて、モデルを最適化する
200イメージごとにモデルのパラメータをアップデートして、20回繰り返す。

最後にテストデータでテストしたスコアをプリント!

# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=200, verbose=2)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))




Baseline Error: 1.61%

が最終出力。つまり10000のイメージでテストしてみて、1.61%はこのモデルでの予想とはずれたが、98.4%は正解になったということ

こんなシンプルな2層のネットワークでも98.4%正解になると驚きだった。まあ人間がやれば99.9%ぐらい成功できるだろうけど。

ただこのチュートリアルはシンプル 編なようなので、次週もっと正解率を高めるモデル構築を見ていく。

たぶん使ってないDropoutを使うんだろうな。





2017年5月27日土曜日

Jupiter Notebook + Keras(Tensor Flow)でチュートリアルをしてみる2

Jupiter Notebook + Keras(Tensor Flow)でチュートリアルをしてみる1の続き。

前回は環境構築して、簡単なチュートリアルを試してみた。今回はそのコードをこまかく見ていく。

まず必要なライブラリ群のインポート

from keras.models import Sequential
from keras.layers import Dense
import numpy
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot

SVG, model_to_dotはモデルの可視化に使う。その他はKerasのプロジェクトではだいたいimportしないといけないはず。

次にランダムな数を生成した時に再現性を持たせるためにseedを設定。

# fix random seed for reproducibility
numpy.random.seed(7)

学習するデータを読み込みする。このチュートリアルでは糖尿病患者のデータをcsvから読み込み。X, Yの変数に読み込む、Xには全行の0から7の8列の2次元配列のデータ、Yには全行、8列目の1次元配列のデータが入る。
どうやらXには予想のためのデータ、Yにはその結果、0(陰性)、0(陽性)が入っているよう。

# load pima indians dataset
dataset = numpy.loadtxt("../tutorial/1/pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]



次はモデルを定義していく。

KerasではSequentialというモデルを作り、そこにNWの層を追加していく形が基本らしい。
1層目は通常の全結合NWレイヤーで、入力が8 個、出力が12個の物を積んでる。 activationは活性化関数をどうするかというところ、ここではrelu(ランプ関数)が指定されている。現在は一般的にランプ関数を指定した方が精度がいいとされているらしい。

2層目は入力12個で、出力が8個

3層目は入力8個で、出力1個、activationにsigmoid(シグモイド関数)を使って出力を0 or 1 の整数にしている。


# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

モデルの定義が終わったあと、モデルをコンパイルする。
引数は3つとり、optimizer(最適化手法)、loss(損失関数)、metrics(評価指標のリスト)が必要、詳しくはここ参照

最適化手法はadam
損失関数はbinary_crossentropy = logloss
metricsは一般的にはaccuracyを使うらしい。


# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])


コンパイル後、実際に学習を始める。
XはテストデータのNumpy配列、Yは教師データのNumpy配列を与える。
epoches(反復回数)とbatch(何サンプルでgradient disent の更新をするか)も指定する。

model.fit(X, Y, epochs=50, batch_size=10)

最後にモデルの評価を行う。
XはテストデータのNumpy配列、Yは教師データのNumpy配列を与える。

evaluate後モデルの評価スコアが帰ってくる。

# evaluate the model
scores = model.evaluate(X, Y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))



非常に簡単に使えるので、ぜんぜんTensorFlowより敷居が低そう。ただ機械学習、ニューラルネットワークの基礎はしっている必要があるので、CourseraのMachine larning(とくに)week4 week5あたりをやっておくといいと思う。


2017年5月13日土曜日

Jupiter Notebook + Keras(Tensor Flow)でチュートリアルをしてみる1

Tensorflowを昔やってみたのだが、挫折したのでもっと直感的と言われているKerasを試してみる。

インストール

pyenv

Pyhonデータ分析ライブラリたちが入る
Anaconda https://docs.continuum.io/anaconda/install-macos
pyenv使ってるのでこちらを参考にした
http://qiita.com/takehilo/items/1ffe5b266ed6a64690c8

jun-mac:keras jun-ishioka$ pyenv install -v anaconda3-4.2.0
jun-mac:keras jun-ishioka$ pyenv global anaconda3-4.2.0
jun-mac:keras jun-ishioka$ python --version
Python 3.5.2 :: Anaconda 4.2.0 (x86_64) 
source /Users/jun-ishioka/.pyenv/versions/anaconda3-4.2.0/bin/activate 
Tensorflow, KerasはAnacondaのパッケージ管理出あるcondaでインストール

Googleの機械学習ライブラリ
Tensorflow  https://www.tensorflow.org/install/install_mac

conda install -c conda-forge tensorflow

Tensorflowのラッパー、より直感的に操作できる
Keras https://keras.io/#installation

conda install -c conda-forge keras

もろもろインストール後、Jupiter Notebookという対話しきのPytyon GUIを起動(これはAnacondaにデフォルトで含まれているみたい)

jupyter notebook

ブラウザが立ち上がりファイラーが表示される。
 適当なフォルダを作って、NewからPython [conda root]を選択。
 そうすると、ノートブックが出来上がる。

このセルの中にはマークダウンでドキュメントを書いたり、コードを書いて実行したりできる。

ここのチュートリアルをやってみた。
http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/
実行したいときはCell -> Run Cells
 無事実行完了、Jupyter Notebook素敵すぎる。コードの管理とかかなり楽になりそう。

Kerasのコードの内容まで踏み込みたいのだが、環境構築に手こずってしまったので今日はここまで。