楽屋

Keras 対応された最新 CNTK v2.0 を試す

最近 GPU を触るのが楽しくて仕方がないデータ事業部の石川 (@hoto17296) です。

猫も杓子もディープラーニングというこのご時世ですが、最近のニュースで言うと CNTK のバージョン 2.0 がリリース されましたね。 CNTK とは、Microsoft が OSS として公開しているディープラーニングライブラリです。

CNTK v2.0 で追加された目玉機能のひとつに「Keras のバックエンドとして使用できるようになった」というのがあります。

今回はこの新機能を使って Keras から CNTK v2.0 を試してみたいと思います。

Keras とは

Keras は Python 用のディープラーニングライブラリです。

とは言っても、Keras 自身が計算を行うわけではなく、Theano や TensorFlow といった別のディープラーニングライブラリをバックエンドとして使用します。 「CNTK v2.0 から Keras のバックエンドとして使用できるようになった」というのは、Keras の裏で使用するライブラリとして CNTK を選択できるようになった、ということです。

「裏で別のライブラリを利用しているなら直接それを使えば良いんじゃないの?」と思うかもしれません。

Keras の公式ドキュメント には以下のような文章があります。

Kerasは機械向けでなく,人間向けに設計されたライブラリです.ユーザーエクスペリエンスを前面と中心においています

TensorFlow や CNTK は ディープラーニングのための計算を効率よく行うための、言わば機械向けのライブラリ であるのに対して、Keras はそれらのライブラリを 人間が簡単に扱えるようなインタフェースを提供するライブラリである、というイメージです。

CNTK は macOS 非対応

CNTK は Windows と Linux をサポートしていますが macOS はサポートしていません。 自分は仕事でもプライベートでも Mac を使っているのでこの点は残念です・・・。

しかし Linux で動くのであれば、今の時代なら Docker を使うことで Mac でも CNTK を動かせそうです。

今回の趣旨からは少し外れますが、Docker で CNTK + Keras を動かす方法について簡単に紹介します。

CNTK の公式 Docker イメージをベースに Keras を入れる

CNTK はものすごく巨大なライブラリです。 一度 CTNK をソースからビルドしてみたことがありますが、それなりに良いマシンでも4時間くらいかかって大変でした。

ソースからビルドして CNTK イメージを作るのはカジュアルではないので、CNTK の公式 Docker イメージ をベースに Keras をインストールしていきます。

デフォルト (latest) だと GPU 版になってしまうので、CPU (GPU 無し) 環境で利用する場合には 2.0-cpu-python3.5 タグを指定する必要があります。

また CNTK はベースイメージだけでも 4.7GB (GPU 版は 6.0 GB) あるので、ストレージの容量には注意しましょう。

これで cntk-keras という名前のイメージが作成できたはずです。

ビルドしたイメージを利用する

さきほどビルドしたイメージからコンテナを起動してみます。

コンテナの起動コマンドを省略していますが、省略するとこのイメージの場合は bash が実行されます。 Bash プロンプトが表示され、コンテナにログインできたかと思います。

CNTK と Python 3.5 と Keras がインストールされたコンテナにログインできたので、このコンテナの中で以降の作業を進めていきます。

MNIST で試してみる

では実際に MNIST データセットを分類するモデルを CNTK + Keras で実装してみましょう。

モデルを作る

以下のコードは、畳み込み層が2層と全結合層が1層からなるシンプルな CNN です。

最適化アルゴリズムには確率的勾配降下法 (SGD) を使用します。 学習率などのパラメータはデフォルト値のままです。

モデルのサマリを表示する (model.summery()) と、以下のようになります。

パラメータ数は約120万です。 この程度であればまだ CPU だけでも学習できそうです。

学習させる

それでは MNIST データセットを読み込んでモデルに学習させてみましょう。

MNIST データセットは配布元からダウンロードしてきてもいいですが、Keras には主要なデータセットをダウンロードして読み込んでくれる機能があるため今回はこちらを利用します。

実行した結果は以下のようになりました。

テストデータでの精度が 98.7% なので、うまく学習することができたようです。

まとめ

Keras を使うことで、CNTK で直接実装するよりも遥かにコード量を少なく、可読性が高くすることができました。

実は今回実装した程度のシンプルなモデルであれば、バックエンドを CNTK から TensorFlow に切り替えてもそのまま動いたりします。

バックエンドが簡単に切り替えられるというのは、あるバックエンドでうまくいかなかった際に簡単に別のバックエンドを試すことができるので便利です。

Keras といえばバックエンドは TensorFlow というイメージが強いですが、ぜひ CNTK も試してみてはいかがでしょうか。