Kerasチュートリアルに学ぶ簡単な実装|DeepLearningの実装 #1

f:id:lib-arts:20190115155153p:plain

ライブラリの使い方を中心に取り扱った記事は深い考察になりづらいのであまり書きたくないのですが、DeepLearning系は仕様の変化が早過ぎるので、DeepLearningの実装に関しては諸々のドキュメントのまとめを備忘録も兼ねてシリーズ化していければと考えています。
#1では

Home - Keras Documentation

上記のKerasのドキュメントをベースにKerasの概要や使用方法についてまとめたいと思います。
以下目次となります。

 

1. Kerasの概要
2. Sequentialモデルに関して
3. functional APIに関して
4. まとめ

 

1. Kerasの概要

Home - Keras Documentation

上記の『Kerasとは』から引用します。日本語なのがありがたいです。

Kerasは,Pythonで書かれた,TensorFlowまたはCNTK,Theano上で実行可能な高水準のニューラルネットワークライブラリです。Kerasは,迅速な実験を可能にすることに重点を置いて開発されました。アイデアから結果に到達するまでのリードタイムをできるだけ小さくすることが,良い研究をするための鍵になります。

上記のように記述されています。Kerasは様々な深層学習ライブラリ(backend)のラッパー(APIを整えて使いやすくしたもの)で、他のライブラリをベースに使いやすいAPI(インターフェース)を提供してくれています。中でもTensorFlowは世界的にシェアが大きいライブラリで、下記の図ではTensorFlowとKerasがどちらも幅広く世界的に使用されていることを示しています。 

f:id:lib-arts:20190115161950p:plain

[Deep learning frameworks ranking computed by Jeff Hale, based on 11 data sources across 7 categories from "https://keras.io/ja/why-use-keras/"]

KerasとTensorFlowの違いに関しては、TensorFlowはカスタマイズをがっつり行いたい時に向いており一方でKerasはシンプルなAPIで用いたい際に向いています。最近関わった実例としては生存時間解析とCNNを組み合わせたSurvivalCNNについて実装を試みたのですが、尤度関数が若干特殊でその際はKerasではなくTensorFlowの方が早く実装できそうだったのでTensorFlowを用いました。

概ね上記がKerasの概要になります。基本的にはTensorFlowをシンプルに使いやすくしたものと捉えておくのが良さそうです。


2. Sequentialモデルに関して

Kerasのモデルは二通りの実装方法があり、シンプルでベースに使われるSequentialモデルと若干複雑なfunctional APIがそれぞれ紹介されています。2節ではSequentialモデルについて簡単なサンプルを元にまとめておければと思います。

keras/mnist_mlp.py at master · keras-team/keras · GitHub

keras/mnist_cnn.py at master · keras-team/keras · GitHub

ドキュメント全て読むのは面倒なので、動作例を見つけたのでこちらを貼り付けました。
(ソースの断片だと動かす際にどこまで貼れば良いのかストレスなので、極力ファイル単位でリンクの共有とできればと思います。)
それぞれMNISTのデータを元にMLP(Multi Layer Perceptron)とCNNで学習を行ってくれています。Jupyter上に貼り付けて実行するでも、"$ python ファイル名.py"で実行するでもどちらでも良いかと思います。

 

Sequentialモデルのガイド - Keras Documentation

実際に動作確認ができたところで上記の説明より処理過程に合わせていくつかピックアップしたいと思います。

・モデルの構築

model = Sequential()

基本的には上記のようにSequential()で生成したインスタンスをmodelに入れているようです。ここにmodel.addしてレイヤーを追加してモデルを構築していく形になります。addを用いなくてもSequentialの引数にレイヤーを入れることでもこちらは実装が可能なようです。

・誤差関数(loss function)の設定&最適化の設定
どちらもcompileメソッド(ドキュメントの場合はmodelでインスタンスを持っているのでmodel.compile)で実行します。

# マルチクラス分類問題の場合
model.compile(optimizer='rmsprop',
       loss='categorical_crossentropy',
       metrics=['accuracy'])

一つだけ抜粋しましたが、引数としてoptimizerやlossを与えることで、誤差関数と最適化に関する設定を行うことができます。

・学習の実行

# 各イテレーションのバッチサイズを32で学習を行なう
model.fit(data, labels, epochs=10, batch_size=32)

モデルの構築〜最適化の流れまで一通り定義できたので、学習(訓練)の実行を行います。この実行に関してはfitメソッドを用います。上記がドキュメント記載の実行の例です。

 

Sequentialモデルのガイド - Keras Documentation

GitHubの実装例に上がっているMNISTの例を最初に動かしましたが、上記ページの下の方にも実装がまとまっているのでこちらを確認するでも良い気がします。


3. functional APIに関して

Functional APIのガイド - Keras Documentation

上記ページをベースに簡単にまとめます。
Sequentialモデルについて知識がある前提でとあるので、こちらの方が発展的な使い方であるようです。そのため、今回は軽く流します。
例1の全結合ネットワークの学習データをMNISTのデータに差し替えれば動くようなので、動作確認は取りやすいかと思います。

ざっと見た感じだと、こちらのfunctional APIはTensorFlowに近い使い方で計算グラフを構築するような書き方の印象でした。


4. まとめ

Sequentialモデルが非常にシンプルで使いやすいAPIのようでした。モデルのカスタマイズ性がどこまであるかが気になるところです。
TensorFlowラッパーのところはTensorFlowを使いこなす上でも読むと面白そうなので、一度KerasからTensorFlowを叩いているところについては時間がある際に確認してみようと思います。
#2ではTensorFlowについて取り扱っていければと思います。