Kerasの実装と設計|Pythonで学ぶシステム設計 #5

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

#2ではscikit-learn、#3ではDjango、#4ではgensimについて取り扱いました。

#5はTensorFlowの仕様変更にキャッチアップしていくにあたり、TensorFlowのラッパーであるKerasについて取り扱いながら全体の優先度を掴んでいければと思います。
以下目次になります。

1. DeepLearningとフレームワーク
2. TensorFlowとKeras
3. Kerasの実装
3.1 keras.datasets
3.2 keras.models
3.3 keras.layers
3.4 keras.optimizers
4. まとめ


1. DeepLearningとフレームワーク

DeepLearning(深層学習)は多くの利用ケースが考えられる汎用的なアルゴリズムである一方、常に計算リソースとの戦いになります。GPUを用いた並列演算だったりMobileNetなどのネットワークの軽量化だったりと様々な取り組みがなされています。
この諸々の実装に際してscikit-learnのような汎用的な機械学習のライブラリからは独立した形で様々な深層学習のフレームワークが実装されています。中でも世界的なシェアとして大きいのがTensorFlowやKerasです。

それぞれ深層学習に特化して様々な機能やインターフェースの開発がなされています。DeepLearningを使いこなしていく上ではこれらのフレームワークを使いこなすことが必須となります。
一から作るのは流石に現実的ではないと思われます。検証環境自体に相当の計算リソースと資金が投入されていると思われます。が、インターフェース部分のラッパーについてはあくまでUI的な話なので改造の余地がありそうです。その辺に特化しているのが今回のメインテーマであるKerasです。


2. TensorFlowとKeras

上記のKerasの記事でも書きましたが、KerasはTensorFlowのラッパーです。機能が様々ありなかなか把握しづらいTensorFlowに対して、Kerasは諸々のコーディングが行いやすいようにインターフェースに気をつけて設計されているライブラリです。
TensorFlowは仕様変更が早くなかなかキャッチアップするのが大変なのですが、Kerasの開発者と同じ目線でTensorFlowを見ていけばキャッチアップしていくにあたっての糸口が見えそうです。

色々と見た後にKerasをカスタマイズすることでオリジナルのTensorFlowのラッパーを作ってみるのも面白いのではと考えています。


3. Kerasの実装

最初にあまり難しい例を元にコードの解析をすると予期せぬところに落ちることもあるので、下記のMNISTのMLP(MultiLayler Perceptron)を題材にKerasの中身について確認していければと思います。

https://github.com/keras-team/keras/blob/master/examples/mnist_mlp.py

今回のソースコードリーディングの目的は上記コードのライブラリ側の実装の概要の把握としたいと思います。

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

具体的には上記の4行の元ファイルで実装のイメージを掴めればと思います。それぞれ3.1〜3.4で確認を行います。

 

3.1 keras.datasets

3.1ではkeras.datasets.mnistの確認を行います。#4までと同様に元ファイルを探すと

keras/mnist.py at master · keras-team/keras · GitHub
に実装が見つかります。
データ自体はライブラリ内には乗っておらず、mnist.npzをダウンロードしてきて手元に解凍する流れになっているようです。

 

3.2 keras.models

3.2ではkeras.models.Sequentialの確認を行います。

keras/models.py at master · keras-team/keras · GitHub
上記を確認すると"from .engine.sequential import Sequential"としているので、

keras/sequential.py at master · keras-team/keras · GitHub
上記に実装があることがわかります。

 

Sequentialの機能(メソッド)としてチュートリアルコードにあるのが、add、summary、compileです。それぞれ内容を俯瞰できればと思います。
・addについて

if self.inputs:
    self.build()
else:
    self._layers.append(layer)

メソッド内に上記の実装が見つかります(インデントは省略)。ここでlayerはメソッドのdefのところで引数として受け取っているので、layersクラスの引数をaddではself._layersプロパティのリストにappend(要素の追加)を行なっていることがわかります。

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

ちなみにMLP実行後にmodel._layersを調べてみると上記のようになり、仮説が正しいことがこれでわかります。

 

・summaryについて

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

実行すると上記のような結果を出力してくれます。モデルの要約情報を出力してくれているようです。

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

Sequential->Model->Networkと継承しています。親クラスであるNetworkにsummaryの関数が見つかりました。

 

・compileについて

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

こちらはModelクラスで実装されていました。


3.3 keras.layers

keras/__init__.py at master · keras-team/keras · GitHub
上記を確認したところ"import *"が多用されており、具体的な参照ファイルの記載がありませんでした。とはいえDenseやDropoutは基本的な処理なので、core.pyあたりが怪しいということで確認してみたらDenseやDropoutは下記のファイルで確認することができました。

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


3.4 keras.optimizers

keras/optimizers.py at master · keras-team/keras · GitHub
上記に実装が見つかりました。RMSpropはOptimizerを継承して諸々実装が行われているようです。


4. まとめ

今回は大体の構成の概要を掴みたかったので、このくらいにできればと思います。
TensorFlowとのつなぎはいくつかのファイルで記載があり、"from .. import backend as K"などの記法で読み込みを行なっているようでした。中身のさらなる詳細な解析については行なったのち別の記事でまとめていければと考えています。