読者です 読者をやめる 読者になる 読者になる

オモンパカリスト

深層学習、計算論的神経科学に興味あります

Kerasつかってみた。紹介とか。おすすめサイトとか。

Keras 機械学習 Deep Learning

深層学習フレームワークとしてKerasを使ってみたら結構楽しかったです。
直感的なレイヤー型記述はChainerに似てます。
Theano または TensorFlowのラッパーとして動くので低レベル記述も効いて汎用性は高そうです。

おすすめのサイト(随時更新するつもり)

Machine Learning Mastery
このサイト(英語ですが)の[Start Here]からKerasで単純なNNやCNN、LSTMの実装を学べる。

Elix Tech Blog
日本語で丁寧。Auto EncoderだったりKerasの実装が充実しています。
めちゃくちゃ助かる。

The Keras Blog
公式ブログ。英語ですがサンプルが豊富でありがたい。
実装だけでなく、アルゴリズムの勉強にもなります。
自己符号化器の記事がすごい充実してる。
Variational Auto Encoderもある。

Kerasの紹介

もともとTheanoのラッパーライブラリとして開発。
複雑なアルゴリズムをTheanoで記述しようとするときつい。
そのため多くのラッパーライブラリが開発されており(Pylearn2など)
その中のひとつ。

バックエンドの計算でTheanoが働いている。
TensorFlowによるバックエンド処理も開発されており、
このバックエンドを設定ファイル(jsonフォーマット)でTensorFlowに切り替えることもできる。

``~/.keras/keras.json (Theanoモード)

{
    "image_dim_ordering": "th", 
    "epsilon": 1e-07, 
    "floatx": "float32", 
    "backend": "theano"
}

``~/.keras/keras.json (TensorFlowモード)

{
    "image_dim_ordering": "tf", 
    "epsilon": 1e-07, 
    "floatx": "float32", 
    "backend": "tensorflow"
}

必要に応じて(?)TensorFlowに切り替えてTensorBoardで可視化できるし、
Pickleを使ってオブジェクトを保存するのではなく、
History.historyというディクショナリ型データを保存すれば、
matplotlibなどでいつでも可視化が容易い(上記のElix Tech BlogさんのKaggle~記事が参考になります)(下記にちょっと例を示しました)

import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np

# 乱数種を設定
seed = 7
np.random.seed(seed)

# データセット(pima indians)の準備
dataset = np.loadtxt("pima-indians-diabetes.csv", delimiter=",")
X = dataset[:,0:8]
Y = dataset[:,8]

# モデルを定義
model = Sequential()
model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))

# モデルをコンパイル
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 学習
model.fit(X, Y, nb_epoch=150, batch_size=10)

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

モデルの定義はChainerに似たレイヤー型の記述。
逐次的にモデルを記述するSequentialクラスのコンストラクタに層を追加していく書き方。
書き方は他にもあって、後述。

モデルをコンパイルする時に、どういう処理を行うか(損失関数や最適化手法)を選択する。

学習はfitメソッドだからScikit-learnライク。
ちなみにラッピングすることでScikit-learn APIとして使えることができる。

def create_model():
    ...
    return model
    
model = KerasClassifier(build_fn=create_model)

公式ブログでSequentialではなくModelという書き方が行われているように、
この書き方も柔軟性があって面白い。

from keras.layers import Input, Dense
from keras.models import Model
from keras.datasets import mnist
import numpy as np

encoding_dim = 32
input_img = Input(shape=(784,))
encoded = Dense(encoding_dim, activation='relu')(input_img)
decoded = Dense(784, activation='sigmoid')(encoded)
autoencoder = Model(input=input_img, output=decoded)

autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

すげーDSL感。。

学習fitメソッドは返り値にHistoryオブジェクトを返す。

ae_object = autoencoder.fit(x_train, x_train, nb_epoch=50, batch_size=256, shuffle=True, validation_data=(x_test, x_test))

History.historyはディクショナリ型であり、
lossval_lossをキーとして持つ。

これを試しにmatplotlibで可視化してみる。

import matplotlib.pyplot as plt

plt.figure(figsize=(6, 4))
plt.plot(range(len(ae_object.epoch)), ae_object.history['loss'], label='loss')
plt.plot(range(len(ae_object.epoch)), ae_object.history['val_loss'], label='var_loss')
plt.xlabel("Epochs")
plt.ylabel("loss")
plt.legend(loc="upper right")
plt.show()

f:id:i101330:20161014210616p:plain

まとめ

新しい論文たちがバリバリKerasで実装されている。
人気ライブラリであるため日本の文献も次第に増えていくと思う。
バックエンド(TheanoまたはTensorFlow)の低レベル操作も可能なため、
実装したいものについて拡張しやすいところも特徴だと思う。

from keras import backend as K
...
K.exp(x)

P.S. たとえMNISTでもCPUは学習時間がしんどいのでつらい。。
GPU環境ほしい。。タダで。。