HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

kerasとchainerの違い

 

 

follow us in feedly

KerasとChainer

Keras

KerasはTensorFlowあるいはTheanoをバックエンドとして、簡単にニューラルネットを記述することができます。もともとはTheano用でしたが、TensorFlow登場後に対応しました。開発者の中にはGoogleの方もいます。

 

s0sem0y.hatenablog.com

 

Chainer

日本製の深層学習ライブラリ。

ニューラルネットワークに必要な計算を柔軟に設計できます。行列などの計算としてはNumpy(GPU用にCupy)をしようしており、純粋にPythonで実装されているライブラリです。

s0sem0y.hatenablog.com

 

比較

Kerasの役割

TensorFlowがテンソルの計算と計算グラフを実装したものであり、GPUなどを用いた並列計算を容易にする機能も備えています。ニューラルネットはテンソルの計算で実現でき、また計算グラフで表現できるため、TensorFlowはニューラルネットを設計するツールとして有用ですが、別にそれ専用というわけではありません。

 

KerasはTensorFlowをバックエンドに、直感的な記述でニューラルネットを記述できます。一行の記述で、TensorFlowでは複数行書かなければならないニューラルネットの層の記述を実現するものだと思えばいいでしょう。

TensorFlowの機能をニューラルネット用にまとめているといった感じでしょうか。

従って、TensorFlowに無い機能はKerasでは実現できません。またTensorFlowはテンソルの計算を実現しているだけなので、テンソルの計算でできる全てのことができますが、Kerasはそれをニューラルネット用にパッケージングしているわけですから、細かい操作をすることもできません。

 

ニューラルネットの中身に突っ込んで、込み入ったことをしないのであれば、現状Keras程手軽なものは無いと言えます。

 

Chainerの役割

TensorFlowがテンソルの計算と計算グラフを実装したもの、KerasがTensorFlowの機能をニューラルネット用にまとめあげたもの、という構図を考えれば、ChainerはどちらかというとKerasに近い立場のフレームワークになります。

Chainerは計算グラフの実装からニューラルネットの訓練までの記述をカバーしており、行列やテンソルの計算をCupyやNumpyで補うという形です。TensorFlowのようにChainer自身がテンソルの計算を実装しているわけではないので、ニューラルネットを記述するということ意外の、もっと低レベルな操作というものはChainerではできません。

 

f:id:s0sem0y:20161220085412p:plain

 

ところが、Chainerは純粋なPythonでの実装です。Chainerで行う操作もPythonのプログラムそのものなのです。ですから、ニューラルネットの構造そのものにPythonの構文を入れることができますし、全ての記述がPythonで閉じているわけです。

 

何かニューラルネットとは関係の無い操作をしたければ、NumPyやmatplotlibを使うなど、いくらでもやりようがあります。また、これらの操作をいつでもChainerでの記述のどこにでも使うことができます。

 

従ってニューラルネットをPythonで最も柔軟に記述できるのはChainerだと言えるでしょう。

 

 

Kerasでの実装

Kerasで畳み込みニューラルネットを記述するときのコードの一例は以下のような感じです。

 

model.add(追加したい層)

でひたすら積み上げていくだけです。

このモデルは入力が1×28×28の3次元配列なので、例えばmnistのようなモノクロ画像データの分類に使えます。ドロップアウトや活性化関数も「層」のように扱っています。また、正則化は各層ごとに設定できます。

 

まあとにかく直感的。簡単なモデルを作ってみて、あとは公式ドキュメントなので層の機能を色々調べながら適当に追加して遊ぶことができます。

 

Chainerでの実装

chainerで畳み込みニューラルネットを記述するときのコードの一例は以下のような感じです。

 

__init__で必要なパラメータ(線形変換など)を準備しておきます。ここで準備したものを必ずしも全てニューラルネットワークに適用する必要はありません。__call__がフィードフォワードの処理です。

その後__init__で定義したパラメータ(線形変換など)を色々駆使して、処理を記述します。

コメントアウトしてあるのはバッチ正規化の処理です。しっかりと次元の数を合しさえすれば、線形変換の処理をコメントアウトしても良く、あくまで__init__で定義したものをすべて用いる必要はありません。

実際にデータを与えたときに呼び出されるのは__call__の方であり、しかもデータが与えられる度に呼び出します。

Kerasでは一度ネットワーク構造を構築したら、すべてのデータがそのネットワークを流れますが、Chainerではデータごとに毎回__call__を呼び出すために、データに合わせて処理を変更することができます。

例えば、__call__の中にif文を入れて、入力データの条件に合わせて処理を変えるなどのことができるはずです(ちょっとまだ確認していませんが)。

 

最後に最適化手法を設定し、最適化手法に対してadd_hookで正則化を追加しています。

この方法だと層ごとに正則化を考えることができない気がするのですが、Kerasのように層ごとに設定できるのかは追々確認していきます。

 

 

使い分け

Chainerがいいなあ

正直、私はChainerが世界的に流行るのであればChainerを使いたいです。

Pythonで一貫しているため、私がやりたいと思っているPython自体の勉強にもなりそうですし、Pythonの勉強が進めば、Chainerのソースコードも分かるようになってきますし、上達が最も円滑だと思われるからです。

 

Googleの強さ

しかし実際には世界では圧倒的にTensorFlowが人気であり、それに伴いKerasの人気も上がっています。Googleは人工知能開発のトップであり、そこが自社開発に使っているのであれば安心感は莫大です。

 

使い分け

まずライトユーザーには間違いなくKerasがオススメです。

バックエンドにTensorFlowを使うかTheanoを使うかはお好みで。ただし高階のテンソルを使うときにはインデックスの位置が、バックエンドによって異なるので注意。

 

ヘビーユーザーでPython大好きな人はChainerで良いと思います。

Chainerの中身の改良から、処理の内容まで全てがPythonで終わります。

また、先ほど説明した通り、データが呼び出される毎に処理が呼び出されるので、データに合わせた分岐処理などを準備しておくことで動的にネットワークを変形させることができます。コレにより、複雑なネットワークを実装するのが容易になっていると思われます。(多分)

 

世界のコミュニティーに参加しながら、盗み聞きしながら学びたいヘビーユーザーはTensorFlow+Kerasが良いかと思います。

まずは検討しているニューラルネットの構造をKerasで素早く実装し実験。見込みがあればTensorFlowで実装し細かい部分まで改良するというスタイルが良いでしょう。Kerasの利点はともかく実装がすぐできることです。小回りは効きませんが、ニューラルネットの大枠を決める段階において、あれこれ実験したいのであればコレほど素早く開発できるものはないでしょう。

 

 

なんて言ってたら、TensorFlowに目移りしそうだ。