Kerasとは?
深層学習ライブラリのTensorFlowとTheanoに対応したラッパー。
簡単に言えば、TensorFlowやTheanoをブラックボックスにしたままその機能を使うことができる上級言語です。
公開されてから続々の記事が出てますが、我慢して日本人の維持でChainerをやってきた私も、ついにKerasを少し触ってみました。
ちなみに最近このツイートが話題で、頭を鈍器で殴られた気持ちでした。
TensorFlowを使うのと何が違うのか
TensorFlowは、たしかにニューラルネットワークを記述すること優れたライブラリではありますが、他のこともできますし、学習の繰り返しコードは自身で実装せねばならず完全特化というわけではありません(もちろんそれによって、細かい処理を書ける)。
一方Kerasは、TensorFlowのニューラルネットに関する処理を呼び出すためのライブラリと言った立ち位置で、TensorFlowでは十数〜数十行のコードを数行で記述することができます。
もしも学習の際の計算式自体を自分で考案した新たなモノに変更したいとか、誤差逆伝搬法では計算できないような完全オリジナルのネットワークを実験したいとかの場合は、TensorFlowやあるいはPythonそのもので書く必要が出てきますが、そうでなければ大抵Kerasで事足りるでしょう。
例えば、層の数を変えたいとか、層を枝分かれさせたいとか、従来のネットワーク構造を組み替えて使ってみたいという場合には、おそらく現状最も早くそれを実現できるライブラリではないかと思います。
言わば、既に存在する様々な「層」というパーツを好きなように組み立てるのに特化したライブラリというわけです。また、学習のコードも、訓練データとラベルデータ、バッチサイズやオプティマイザ−などを引数に一行で記述できます。
ちなみにTheanoをバックエンドにすることもできるのでTensorFlowが入ってなくても大丈夫です。
インストールの方法
TensorFlowの場合
TensorFlowが既にインストールされている状態で
pip install keras
これだけで入ります。なんて簡単なんだ。デフォルトでバックエンドがTensorFlowになっていますので、TensorFlowをお使いの方は、あとはkerasを使って書くようにするだけです。
実は私、Chainer使うぞ!と意気込んでTensorFlowをアンインストールしてしまって試せてません。なので、バックエンドをTheanoにして動かしております。
Theanoの場合
深層学習やるの始めてだけど、とりあえず触りたいんだよ!
という場合はこちらの方法で構わないでしょう。
pip install keras
で、kerasを入れます。なんとこれで同時にTheanoも入るので、終わりです。
Pythonは先に入れておいてください。
機械学習をやるならばanacondaやminicondaでいれておくと一気に揃って便利です。
Python自体入っていない人は以下の記事を参考にしてください。
Pythonを入れた後に、kerasをインストールしましょう。
さて、kerasはインストールされた段階ではTensorFlowをバックエンドにしているので、TensorFlowが入っていない人は
import keras
の時点でエラーを吐き出します。こうならないためには、kerasがTheanoをバックエンドにするように設定を変更する必要があります。これもすごく簡単です。
まあ、一度エラーを吐き出させてやってください。
一度でもkerasを起動しようとしたら、設定ファイルが作られます。
kerasはインストールしたディレクトリ(インストール時に何もしていなければホームディレクトリ)に隠しディレクトリとして存在しています。隠しディレクトリは普段表示されていませんが、ディレクトリを開いて「Ctrl+h」で表示することができます。
「.Keras」というディレクトリがあるので、これを開くと寂しく「keras.json」というファイルがあるので、これをメモ帳でも何でもいいので開いてください。
{
"floatx": "float32",
"image_dim_ordering": "tf",
"epsilon": 1e-07,
"backend": "tensorflow"
}
おそらくこのような記述があります。
「tensorflow」という記述を「theano」に変えてやれば設定終了です。
追記:畳み込みニューラルネットを使う場合の引数の順番がTensorFlowとTheanoで異なります。これを指定するのが「"image_dim_ordering": " "」の部分です。
「"image_dim_ordering": "tf"」を「"image_dim_ordering": "th"」
に変更する必要があります。
{
"floatx": "float32",
"image_dim_ordering": "th",
"epsilon": 1e-07,
"backend": "theano"
}
Chainerに比べたアドバンテージ
Chainerは日本人利用者が多いため、参考になるエントリーが多いですし、質問すれば回答も得やすいでしょう。しかし、肝心の公式ドキュメントが意外とTensorflowなどに比べたら手薄で、しかも英語と言った状態で、初心者からは取っ付きづらいという状況です(もちろんTensorFlowのドキュメントも英語ですが)。
Theanoは英語の公式ドキュメントを(機械翻訳したような)日本語ドキュメントがあり、ドキュメント自体が充実しているので初心者にとっても始めやすいかと思います。
また、ネットワークの記述も非常に直感的です。
ただただ、層を1つ1つ積み重ねていくだけでです。
chainerも直感的でありますが、パラメータに相当する部分と、フィードフォワードの処理を別で記述する必要があります(この記述方式にすることで、便利になる部分もありますが、高度なことをしない限りはひとまず恩恵は無いと思います)。
kerasの記述は以下のような感じです。(公式ドキュメント抜粋)
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
model = Sequential()
model.add(Dense(output_dim=64, input_dim=100))
model.add(Activation("relu"))
model.add(Dense(output_dim=10))
model.add(Activation("softmax"))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(X_train, Y_train, nb_epoch=5, batch_size=32)
「model.add」で層を順番に追加していくだけです。
このモデルは、入力が100次元、中間層が64次元、出力層が10次元の多値分類を行うニューラルネットワークとなっています。
層を追加する際に、入力の次元を指定しなければいけないのは一番最初だけで、後は入力の次元は自動で認識するので出力の次元だけ書いていけばいいです(これも地味に楽)。
Chainerの場合は、各層の入力と出力を必ず記述しなければなりません(こういう設計にしておくことで便利になる点もありますが)。
上記のプログラムでは「X_train」を訓練データに、「Y_train」をラベルデータとしてエポック数5、バッチサイズ32としています。
訓練データもラベルデータもnpの配列で与えればよく楽ちんです。
例えば、10次元の訓練データが100個あるならば、配列は(100,10)という形になります。
それに対するラベルは、例えば3クラス分類ならば(100,3)の配列となり、1-of-K符号化法で与えます。
chainerはnpの配列をchainerのtrainerに渡す際にタプルに変更する必要があります。(まあ一行でできますが)
あと、ラベルデータは3クラス分類ならば[[0],[1],[2],[1],[0],...]のような、クラスの番号を一次元で準備することになります。その後タプルで渡します(まあこれも大変ではないですが)。
kerasはネットワーク構造を考え、それを実装することに集中する環境を整備してくれていると感じます。他の部分は全部ライブラリに任せてくれと言わんばかりの機能です。
Kerasは最初の一歩にオススメ
とりあえず、一番最初に遊んでみるならばKerasが圧倒的にオススメです。
インストールも楽(Theanoバックエンドなら一行で終わり)
ネットワーク記述も楽
学習の記述も楽
TensorFlowをバックエンドにするなら、Chainer以上の直感的操作に加え、Tensorboardなどの便利な機能も使うことができます。
うーん。やっぱりGoogle強いなぁ。