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あたりをやっておくといいと思う。


0 件のコメント:

コメントを投稿