Functional APIや自作レイヤのすすめ in Keras

こんにちは、ぐぐりら(@guglilac)です。 Kerasのおすすめ記事的な。
初心者から中級者まで長く使える、入門者にオススメなKerasのおはなしです。

Kerasとは


Kerasはディープラーニングを行うフレームワークです。



難しいところはプログラマー側には見えないようになっており、非常に簡単にプログラミングができるのが長所。

またKerasでは、すでに完成されているレイヤーがいくつもあり、それらをブロックみたいに組み合わせてモデルを定義すれば、とってもラクにディープラーニングができてしまいます。

( おまけにドキュメントが日本語で結構わかりやすく書かれててうれしい。)

この簡単さゆえに、とりあえず流行っているからディープなラーニングをやってみたいなあという方でも障壁を感じることなくディープラーニングに触れることができるため、特に初心者に非常におすすめなKeras。

こんな認識だったので、複雑な構成のレイヤーを含むモデルを作りたい!という欲が出てきたら他のもっと玄人っぽいライブラリにお引越ししないといけないのかなあなんて思っていました。(tensorflowとかプロっぽいかっこいいやつ)

しかし、ある程度ならKerasも複雑なモデル構成や自分でカスタマイズしたレイヤーを実現することができるのです!すごい。

Functional APIと自作レイヤー


一番簡単なKerasの書き方として、Sequential()を用いる方法があります。
レイヤーを積み上げていくとモデルが完成するという、初めてKerasを見た人が「めっちゃ簡単じゃんなにこれ!!」と驚愕するあれです。

これでもいろんなモデルが作れるのですが、もう少し凝ったものが作りたい!というかたに向けてこんなものがKerasには用意されています。
主にこの二つ。

・Functional API -> レイヤー間の関係をいじる

・自作レイヤー -> レイヤーの中身をいじる

ざっくりとですが、この二つについて見ていきましょう。

Functional API


Functional APIとは、先ほどのSequential()とは異なるモデルの定義方法で、レイヤーを積み上げていくのではなくもう少しフレキシブルに各レイヤーを配置することができます。
たとえば、Sequentialではモデルの中で分岐したり、入力を複数取ったりといったことができないのですが、Functional APIではこのような少し凝ったモデルが好きなように定義できます。
ここでは、同じ構成のモデルをSequentialモデルとFunctional APIの2通りで書いてみましょう。

この例ではあまりFunctional APIの良さが伝わりませんが、Sequentialの方はデータの通るルートが一方向で勝手に決められるのに対し、Functional APIの方では入力と出力を変数に入れられるので、どことどこを結びつけるかなどを自由に決められます。
また他入力他出力のモデルなんかも作れます。

詳しくはKerasのドキュメントを参考にしてみると良いでしょう。

Functional APIのガイド

いつか自分でも記事にする。かも(笑)

最初はSequentialでいいですが、慣れてきたら早いうちにFunctional APIの方に移行していくべきだと思います。
そんなに記述量は変わらないのにもかかわらず、Functional APIの方が圧倒的に自由度が高いからです。
ぜひマスターしましょう。

自作レイヤー


モデルの中の構成はFunctional APIの方でいじることができました。

一方、レイヤー自体もKerasではいじることができます。
もともと用意されているよくあるレイヤー以外にも、自分で作ったレイヤーをモデルに組み込みたい!ということがあったりします。

論文とか読んだりすると、ほとんど普通のCNNなんだけど微妙に処理が違う、とかあったりして、そういうのはもともと完成されているKerasのCNNのレイヤーでは実現できません。(片方のチャンネルのフィルタはパラメータを更新するけどこっちはしない、とか)

その辺もある程度ならカスタマイズすることができるように作ってくれています。
Keras様様。

具体的な作り方を説明すると1記事できてしまうほど長いのでこの程度の概略で。
これもドキュメントのリンク貼るので詳細はそちらで。
(自作レイヤーについてはまた記事を書きたいなと思ってます。めっちゃハマったので。)

オリジナルのKerasのレイヤーを作成する

不満なところ

いいところばっかり書いてると胡散臭いのでKerasの不満なところも書いておきます。

Kerasはバックエンドとしてtensorflowやtheano、CNTKが使えるようになっており、いろいろ対応しています。
この関係で、異なるバックエンドでは違う挙動を示すバックエンド関数があったりするのが不満。

他の人がtheanoをバックエンドにして作成したkerasのコードをクローンしてきてtensorflowバックエンドの自分の環境で動かすと動かなかったりしてハマったりします。つらいです。どうにかしてくださいkeras様。

そうそう、なんかtensorflowがkerasを統合したみたいな話があったけど、さすがにtensorflowの中のkerasの方はマルチバックエンドじゃ無くなってるのかな。

こっちがスタンダードになってくれたら、この不満は解消されそう。がんばれtensorflow。

まとめ



初級者から中級者まで長く使えるKerasのおすすめでした。
こんどは具体的な技術のほうを説明した記事を書こう。





コメント