LoginSignup
5
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-06-23

以下の記事は自身がやってるブログを日本語化したもの。最近、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の面倒な設定を行わなくて良いのも楽で良い。

5
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
10