機械学習
DeepLearning
ニューラルネットワーク
NeuralNetwork
Keras

Kerasでのシンプルなニューラルネットワークモデリング

More than 1 year has passed since last update.

以下の記事は自身がやってるブログを日本語化したもの。最近、kerasを触ることが多いので復習がてら

ブログ

概略

ディープラーニングの波が押し寄せているので、kerasの入門として、シンプルなニューラルネットワークのモデルを作成する。

なぜkerasなのか

日頃、ニューラルネットワークモデルの作成にはtensorflowを用いている。tensorflowでの記述はフルスクラッチに比べればはるかに完結ではあるし、記述からネットワークの形もわかりやすい。とはいえそれでも変数やplaceholderの設定など、いちいち記述するのは少々めんどうではあるし、行列計算の基本知識が前提となっているのも気になる。(行列計算についてはニューラルネットワークを扱うならマストの知識としたいところであるが。)

kerasを使用すると、より簡潔な記述でネットワークを書くことができると聞いたので、実際に試してみる。

使用コード

keras_try.py
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の面倒な設定を行わなくて良いのも楽で良い。