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

半年ほどKerasを使ってみた感想など

※この記事は苫小牧高専 AdventCalendar-2016の5日目の記事です。

 はじめに

最近流行りのDeepLearningについての記事を書こうと思います。ただし、理論についてではなく、理論をプログラムに落とし込むためのツールに関するお話です。それも1つのフレームワークに関することなので、比較などではなく自分が使ってみた感想をつらつら書いていきます。

僕は4月から卒業研究でDeepLearningに関する研究をしており、PythonとDeepLearning用フレームワークKeras(バックエンドはTensorflow)な環境で色々コードを書いています。そこで、半年くらいKerasを使ってみていいなと思ったこと、苦しかったことを書こうと思います。テーマはなんでもいいってことだったので、刺さる人が少ないのは申し訳ないですが、この記事がきっかけで機械学習をKeras使って始めてみようみたいな人が出てきてくれたら嬉しいですね。

間違いなどありましたら優しく教えてください、お願いします。

 

Kerasとは

Kerasとは、「Pythonで書かれた、TensorFlowまたはTheano上で実行可能な高水準のニューラルネットワークライブラリです。 Kerasは、迅速な実験を可能にすることに重点を置いて開発されました。可能な限り遅れなくアイデアから結果に進められることは、良い研究をする上で重要です。」ということらしいです(公式ドキュメントより)。

Theanoは数値計算用のライブラリ、TensorFlowはGoogle製の行列計算と分散処理が簡単に書くことが出来るライブラリで、両者とも数値計算や行列計算の応用先として機械学習にも使われているという感じっぽいですね。

 Kerasはこれらのライブラリで機械学習のプログラムを作成しようとするとき、演算に関する複雑だったり煩雑なコードを書かずに簡潔にネットワークを記述し、アイディアを素早く実行出来るよところに落とし込もうというところに重点が置かれているようです。

 

Kerasのいいなと思うところ

ネットワークの記述が簡単であること

豊富な種類の畳み込み層やリカレント層、BatchNormalizationなどがAPIとして提供されているため、ネットワークの記述がとても簡単でした。TensorFlowとKerasで手書き文字の分類をするためのプログラムを書いてみると、Kerasのほうがネットワークの記述部分を簡潔に書くことが出来ます。

また、VGG-16やResNet50、Inceptionv3などの超有名なネットワークはKerasの中ですでに定義されており、簡単に利用することが出来ることも強みだと思います。

僕は卒業研究で初めてDeepLearningの勉強を始め、右も左もわからない状況でKerasに触れてみましたが、畳み込み層を使った手書き文字の分類をするネットワークなどの小規模なものは特に悩むことなく記述することが出来ました。

拡張性が高いこと

KerasではバックエンドにTheanoかTensorFlowを使うので、Kerasで記述されたプログラム内でもバックエンドの関数を利用することが出来ます。

なので、新たな活性化関数を設計したり、レイヤーを設計する際には、KerasのAPIとバックエンドのフレームワークを両方使って記述することが出来ます。

ここらへんがKerasのコンセプトでもあるアイディアを迅速に実行できるようにする、という点にも繋がるんでしょうね。

 

Kerasを使っていて苦しいこと

APIの挙動がよくわからない

KerasのAPIの中には、その挙動がよくわからないものがたまにあるので、GitHub等でフレームワークのコードを読みながら書かないといけない場合があります。

僕が一番ハマったのは、Modelクラスにあるfit_generatorという関数を使ったときでした。この関数は、学習に使うデータがメモリ上に乗り切らない際にPythonのジェネレータという仕組みを使って1つずつ学習用データを構成し、ネットワークに入力してくれるものです。このfit_generator関数を使って研究で作成したネットワークの学習を行うと、入力データに問題があるためネットワークに入力することが出来ないとエラーが出るけど、データに問題があるわけではありませんでした(未だに原因がわからない)。

そのため、Kerasのfit_generator関数とジェネレータを使わないで学習を行うfit関数のコードをお手本にオレオレでfit関数を作ることになり、これに非常に時間がかかってしまった(車輪再開発めっちゃキツい、設計がひどい)。

ただ、滅多なことがなければこのような状況にならないと思うので、あまり心配しなくてもいいと思う。

公式ドキュメントが英語版と日本語訳版で少し違う

これは仕方のないことかもしれないが、Kerasの作製者はアメリカの方で、英語版のドキュメントはバージョンが上がるたびに更新され、Kerasの仕様変更などについても正確に記されている。しかし、日本語版のドキュメントは英訳が間違っていたり、最新バージョンで追加された機能や変更箇所に関する記述がなかったりと信頼に欠ける部分があって時々辛くなってしまう。

実際にAPIを使ってみて少しでも「なんかおかしいな?」と思ったら英語版のドキュメントを頑張って読むことをおすすめします(あと余裕があればGitHubにあるコードも)。

バックエンドが違うと動かなくなる

Kerasでは最初に書いたとおり、TensorFlowとTheanoのどちらかをバックエンドに利用します。しかし、TensorFlowとTheanoでは引数の順番であったり、関数の若干の仕様の差異があるので、ある人がTensorFlowをバックエンドに使用して作成したコードをTheanoをバックエンドに使っている環境に持っていくと動作しなくなってしまいます。

ココらへんは互換性を担保するためにプログラム内でうまく工夫をする必要があるだろうから注意が必要でしょう。

 

まとめ

Kerasはネットワークの記述が非常に簡単なので、DeepLearning初学者にはとてもうれしいと思います(僕もめっちゃうれしかった)。また、KerasのAPIとバックエンドのAPIが共存出来るので、何か新しい活性化関数だったりレイヤーだったりを構築したい場合にもKerasは非常に有効な選択肢になると考えています。

あとは、僕のようなDeepLearning初学者が、とりあえずこの研究を再現したい!やDeepLearningな実験を行いたい!といったときにはKerasがとても便利だと思います。

 ただし、とても複雑な構造のネットワークを記述したいとき、根本的に新しい仕組みなどを実現したいときには、TensorFlowやChainerなどの他のフレームワークを選択するか、他の言語を使ったほうがいいのではないかと僕はこの半年間Kerasを使ってみて思いました。

 

最後まで読んでいただきありがとうございました。

以上、苫小牧高専アドベントカレンダー5日目「半年ほどKerasを使ってみた感想など」でした。6日目はeve_ykさんです!!よろしくお願いします!!