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

amacbee's blog

Pythonの話とかデータの話とか酒の話とか

Python製深層学習ライブラリ「Keras」の紹介 (with TensorFlow)

皆様こんにちは,@a_macbeeです.
(大分時間ギリギリになってしまいましたが)この記事はAdvent Calendar 2015 - VOYAGE GROUP 2日目の担当分になります.

2015年は良くも悪くも深層学習がバズワードとなって盛り上がった年でした. 面白い論文が続々発表されたり,関連書籍が次々出版されたり,最近だとGoogleが発表した深層学習ツールTensorFlowが話題となってます.

このビッグウェーブに乗るしかないということで,この記事では自他共に認めるPython大好きな私がPython製の深層学習ライブラリである「Keras」について紹介します.

Keras

KerasはPython製の深層学習ライブラリです.
もともとはバックエンドとしてTheanoを採用していたのですが,つい最近TensorFlowも選択できるようになりました.ここでは,折角なのでTensorflowをバックエンドとして利用する方にフォーカスして紹介します. 個人的には,シンプルで拡張性の高いところと,開発が盛んでPython3.5でも使える点などが気に入っています(日本だとあまり聞きませんが,海外だと結構人気な印象(あくまで印象))
※バックエンドとしてTensorFlowを利用する場合はPython2.7縛りが発生します

インストール

pipを使って簡単にインストールすることが出来ます.

$ pip install keras 

ベースにTensorFlowを利用する場合は,別途TensorFlowも導入しておきましょう(以下はMac環境に導入する例)

$ pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl

KerasのバックエンドをTensorFlowに変更する

KerasはデフォルトでTheanoを利用する仕様になっているので,TensorFlowを利用したい場合は設定を書き換える必要があります. バックエンドの変更は非常に簡単で,~/.keras/keras.jsonというファイルを作成して以下の内容を書き込むだけです.

{"backend": "tensorflow"}

もちろん,TeanoとTensorFlow両方に対して互換性のある形でコードを記述することが可能です. 個人的にはそこが一番特徴的でKerasの面白い点だと思ってます.
詳細は公式ページをご覧ください:Keras backends

Getting Started

Keras以外の深層学習ライブラリを利用したことのある方であれば,「Getting started: 30 seconds to Keras」をさらえばざっくりとした使い方は分かるかなと思います.

MNIST

ド定番のMNISTを使って,簡単に使い方を説明します.
コードの全容はこちら:MNIST - Keras (Backend: TensorFlow)

Kerasでは,定義したモデルにレイヤを追加していくことでネットワークを定義します.シンプル.

model = Sequential()
model.add(Dense(10, input_shape=(784,), init='zero'))
model.add(Activation("softmax"))

# こう書くことも出来ます
# model.add(Dense(10, input_shape=(784,), init='zero', activation='softmax'))

モデルのコンパイルや訓練,評価などは以下のように書けます.
サポートしている lossoptimizer の種類については公式ページをご覧下さい.

# モデルをコンパイルして訓練
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.01))
model.fit(X_train, y_train, nb_epoch=10, batch_size=100)

# テストデータを使ってモデルを評価
model.evaluate(X_test, y_test, show_accuracy=True)

このコードは,もちろんバックエンドをTeanoに変更しても動きます.

IMDB Movie reviews

もう一つ,映画レビューの感情分類の例を紹介します.
コードの全容はこちら: IMDB Movie reviews sentiment classification - Keras (Backend: TensorFlow)

ここではLSTMを利用しています.
ツールと同様,シーケンス長の調整や,Embeddingなどの操作も非常に簡単に書くことができます.

# シーケンス長をmaxlenに調整
X_train = sequence.pad_sequences(X_train, maxlen=maxlen)
X_test = sequence.pad_sequences(X_test, maxlen=maxlen)

model = Sequential()
model.add(Embedding(max_features, 128, input_length=maxlen))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

Kerasはバックエンドに依存してCPU/GPU環境が分かれます. Kerasで定義されるメソッドを利用する上ではそこを意識する必要はありません(ちなみに上記のコードはCPU環境で動かしてます)

最後に

本当は「A Neural Conversational Model」をやっていたのですが諸々の事情で間に合わなかったので,この辺りでお茶を濁しておきます.気力があればまとめるかもしれません.
KerasはTensorFlow使ってみたいけど文法覚えるのだるいといった私のような人間にはおすすめのライブラリなんじゃないでしょうか.

ここまでやっておいてなんですが,深層学習のツールだとChainerが一番好き.