以下の記事は自身がやってるブログを日本語化したもの。最近、kerasを触ることが多いので復習がてら
概略
ディープラーニングの波が押し寄せているので、kerasの入門として、シンプルなニューラルネットワークのモデルを作成する。
なぜkerasなのか
日頃、ニューラルネットワークモデルの作成にはtensorflowを用いている。tensorflowでの記述はフルスクラッチに比べればはるかに完結ではあるし、記述からネットワークの形もわかりやすい。とはいえそれでも変数やplaceholderの設定など、いちいち記述するのは少々めんどうではあるし、行列計算の基本知識が前提となっているのも気になる。(行列計算についてはニューラルネットワークを扱うならマストの知識としたいところであるが。)
kerasを使用すると、より簡潔な記述でネットワークを書くことができると聞いたので、実際に試してみる。
使用コード
from sklearn import datasets
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.utils import np_utils
import numpy as np
# prepare for data
iris = datasets.load_iris()
features = iris.data
targets = np_utils.to_categorical(iris.target)
# check data
print("explain variables\n{}".format(features[:10]))
print("explained variables\n{}".format(targets[:10]))
# split data into train and test
x_train, x_test, y_train, y_test = train_test_split(features, targets, train_size=0.7)
# set model
model = Sequential()
model.add(Dense(8, input_dim=4))
model.add(Activation('relu'))
model.add(Dense(3, input_dim=8))
model.add(Activation('softmax'))
model.compile(optimizer='SGD', loss='categorical_crossentropy', metrics=['accuracy'])
# train
model.fit(x_train, y_train, nb_epoch=50, batch_size=4)
# predict the labels of test data
pred = model.predict_proba(x_test)
pred_list = pd.Series([np.argmax(value) for value in pred])
true_list = pd.Series([np.argmax(value) for value in y_test])
print(pd.DataFrame({'predict': pred_list,
'True_category': true_list}))
ポイント
データ
今回使用したのはフィッシャーのirisデータ。モデルの目的は四つの説明変数から、被説明変数(カテゴリカル)を予測すること。
# prepare for data
iris = datasets.load_iris()
features = iris.data
targets = np_utils.to_categorical(iris.target)
sklearnは頻繁に使用されるフリーのデータセットを有しており、irisもそのうちの一つ。'np_utils.to_categorical()'は被説明変数をホットエンコーディングする(ダミー化する)。
モデリング
この部分で実際にモデルの記述を行う。
# set model
model = Sequential()
model.add(Dense(8, input_dim=4))
model.add(Activation('relu'))
model.add(Dense(3, input_dim=8))
model.add(Activation('softmax'))
model.compile(optimizer='SGD', loss='categorical_crossentropy', metrics=['accuracy'])
Sequential()によって作成されたオブジェクトがadd()メソッドによってレイヤーを加えていく。活性化関数の指定もレイヤーの追加のように記述することができる。(引数として指定することも可能)
Dense()の部分では引数に与える数字でそのレイヤーが持つノードの数を設定できる。最初のレイヤーではインプットとして受けるノードの数を指定する。
Activationの部分では、重みと入力ノードの線形結合された値を適応させる活性化関数を指定している。
まとめると、上記のモデルは以下の内容となる。
* 入力層は四つのノードを持つ(データは四つの説明変数を有している)
* 隠れ層の数は一つで、ノード数は8
* 隠れ層のそれぞれのノードは入力層のノードの重みとの線形結合された値を受け取り、活性化関数を適応させる
* 出力層は3つのノードを持つ(分類先のユニーク値の数に対応)
* 出力層のそれぞれのノードは入力層のノードの重みとの線形結合された値を受け取り、活性化関数を適応させる
まとめ
kerasを用いるとニューラルネットワークのコードは相当短く書ける。
変数やplaceholderの面倒な設定を行わなくて良いのも楽で良い。