Kerasのインストール
こういうインストール関係の記事はすぐ時代遅れになるので詳細は省くけど、現在の自分の環境など簡単にまとめておきたい。
- Ubuntu 16.04
- Python 3.5
- Anaconda 4.2.0
- TensorFlow 0.11
- Keras 1.1.0
1. Ubuntuの仮想マシンを作成
普段はWindowsマシンを使っているが、KerasはWindowsとの相性がとことん悪いなと感じる。
KerasのバックエンドとしてTheanoまたはTensorFlowが選べるのだが、TheanoをGPU有効でWindowsにインストール(2015/1/27)するのは意外に大変。入った!と思っても実行時に意味不明の長大なエラーが出たりする。TensorFlowはそもそもWindowsに対応していない・・・そんなわけでWindowsに入れるのはもはやあきらめて仮想マシンを導入した。
仮想マシンだとホストにGPUがあっても使えないのがちょっと問題。いずれAWSやさくらのGPUインスタンスも試してみたい。
ちなみにAtomやPyCharmなどのGUIエディタを使いたいがため、UbuntuはGUI込みでインストールした。3Dアクセラレータ有効にしてもちょっともっさりする。AtomのRemote-FTPを使った遠隔編集を最近知ったのだがとても便利。遠隔にあるファイルをローカルにあるみたいに編集できる。
2. Anaconda Python 3.5 versionをインストール
最近はPythonの公式からインストールすることはほとんどなくなった。NumPy, SciPy, matplotlib, scikit-learn, pandasなど全部入りのAnacondaが最強!名前からして強そうだもんね。あとPython3に移行した。
3. TensorFlowをインストール
KerasのデフォルトのバックエンドがTheanoからTensorFlowに切り替わったこともあり、最近ではTensorFlowを使うようにしている。Kerasの前にインストールしておかないとダメ。TensorFlowのインストールページでは、condaで仮想環境を作ろうとなっているが、環境の切り替えが面倒なのでデフォルト環境にそのままインストールしてしまった。
4. Kerasをインストール
Kerasはpipで入るのですごく簡単。バックエンドの切り替えは、~/.keras/keras.json
というファイルに書く。設定ファイルがjsonなのがナウいと思った。
{ "image_dim_ordering": "tf", "epsilon": 1e-07, "floatx": "float32", "backend": "tensorflow" }
デフォルトのbackend
はtensorflow
になっている。この設定にあるimage_dim_ordering
も実は要注意でth
かtf
かによって画像集合を表す4次元テンソルの順番が変わる。これを知らなくてはまったことがある。なぜここだけth
とかtf
とか略称なのだろう・・・という疑問はあるが、デフォルトの設定のままでよいと思う。
参考
Kerasはじめます
前回の更新(2016/3/18)からいろいろあってだいぶ間があいてしまいましたが、気を取り直してまた何か書いていこうと思います!しばらくは、Deep Learningのライブラリ Keras を使ってさまざまな実験をしていきます。Theanoでの実装(2015/4/29)はきついのでもう止めます(笑)
当面は、
の面白そうなプログラムや記事を参考にKerasの使い方をまとめていこうと計画しています。記事の翻訳ではなく、自分なりに理解して試行錯誤した結果をかみ砕いてまとめていく予定です。まあ元記事の方が質が高いかもしれないけど・・・
上のリンク集を見るとわかりますが、海外ではKerasによる実装をあちこちで見かけるのでけっこう普及しているようです。日本でもKerasドキュメントが和訳 されたこともあり、以前より知られてきました。Qiita の記事も増えてきていい感じです。
というわけで次回からやっていこうと思います。
深層学習ライブラリ Keras
ここ1年くらいDeep Learning Tutorialを読みながらTheanoというライブラリで深層学習のアルゴリズムを実装してきた。
深層学習の基本的なアルゴリズムならTheanoでガリガリ書くこともできたがより高度なアルゴリズムをTheanoでスクラッチから書くのはとてもきつい*1。
そんなわけでPylearn2、Lasagne、nolearnなどのTheanoベースのラッパーライブラリをいろいろ調べていたのだが、結局のところKerasというライブラリが一番よさげだと思った。KerasはバックエンドとしてTheanoとTensorflowの両方が使え、より高レイヤな表現(たぶんChainerと同レベル)で深層学習のさまざまなアルゴリズムが記述できる。TheanoやTensorflowは完全に隠蔽されており、Kerasで書かれたプログラムはまったく修正せずにTheanoとTensorflowをいつでも切り替えられる。
Kerasの特徴は
- Modularity
- Minimalism
- Easy extensibility
- Work with Python
の4つ。バックエンドのTheanoによる記述がシンプルで読みやすかったのが調べてみようと思ったきっかけ。
Kerasのメイン開発者はGoogleのFrançois Cholletさん。GithubとTwitterのアイコンがいかした人だ。KerasはGoogleのメインプロダクトではなさそうだがTensorflowのラッパーライブラリとしても将来有望に感じている。下のGithubにおける深層学習ライブラリランキングの結果を見ても人気が高く、海外では開発者も多そうだ。ただこれはCholletさんによる独自集計のようなので多少割引が必要かも(?)
The state of deep learning frameworks: March 2016. pic.twitter.com/awrollWEq9
— François Chollet (@fchollet) 2016年3月15日
Kerasによる実装例
Kerasのサンプルコードを見てみよう。たとえば、MNISTの分類を行う多層ニューラルネットワークは下のように実装できる。素のTheanoによる実装(2015/6/18)と比べるとかなりシンプルに書けることがわかる。個人的な意見だがネットワーク構造の書き方はChainerによる実装(2015/10/5)よりも直感的かもしれない。
- ニューラルネットの構造は
model
にさまざまなレイヤをadd()
することで構築する。 - 活性化関数やDropoutも層とみなす。
model
のコンパイル時に最適化アルゴリズム(例ではRMSprop)と誤差関数(例では交差エントロピー)を指定する。誤差関数として平均二乗誤差も使える。- 最適化アルゴリズムは基本的なSGDからより効率的なAdam、RMSpropまで一通りそろっている。実装もシンプルなのでアルゴリズムの勉強にもなる。
- 学習はscikit-learn(2015/8/10)と同じく
fit()
というメソッドでできる。Kerasは基本的に教師あり学習しか考えておらずRBMのような教師なし学習を実装するには自作が必要。 - 収束判定のEarly-stoppingはコールバックとして実装されており、収束したら自動的にループが止まるようになっている。
- バリデーションデータは明示的に指定することもできるが、例のように訓練データの10%だけ使うといった指定ができる。
fit()
の戻り値のhistory
オブジェクトに各エポックのコストや精度が保存されるためあとで結果をプロットするのに使える。verbose=1
と指定することで下のように学習の進捗をリアルタムに棒グラフで表示してくれる。各エポックにかかった時間、訓練データのloss/accuracy、バリデーションデータのloss/accuracyも一緒に表示される。あとどれくらい学習に時間がかかりそうか見積もりできて便利!
Using Theano backend. Using gpu device 0: GeForce GTX 760 Ti OEM (CNMeM is disabled, CuDNN not available) train samples: (60000L, 784L) test samples: (10000L, 784L) building the model ... Train on 54000 samples, validate on 6000 samples Epoch 1/100 54000/54000 [==============================] - 3s - loss: 0.2969 - acc: 0.9092 - val_loss: 0.1136 - val_acc: 0.9640 Epoch 2/100 54000/54000 [==============================] - 3s - loss: 0.1204 - acc: 0.9631 - val_loss: 0.0855 - val_acc: 0.9765 Epoch 3/100 54000/54000 [==============================] - 3s - loss: 0.0839 - acc: 0.9739 - val_loss: 0.0706 - val_acc: 0.9815 Epoch 4/100 28032/54000 [==============>...............] - ETA: 1s - loss: 0.0660 - acc: 0.9797
当然ながら畳み込みニューラルネットやリカレントニューラルネットを書く機能もある。たとえば、畳み込みニューラルネットのモデルは下のように書ける。
またBatch Normalization、ZCA白色化、Data Augmentationなどを行うクラス(ImageDataGenerator)も用意されている。
最先端手法の実装
最先端の論文に出てくるようなアルゴリズムもKerasによる実装が公開されている。最近話題になったAlphaGoのクローンなんてのもあるけどどうやって学習・実行するんだろう・・・
- Gaussian RBM
- Deep dream
- Neural style transfer
- Generative adversarial network
- DCGAN
- VGG-16
- Deep Q-learning - Lasagne版 はもっとすごい
- Music generation
- AlphaGo
というわけでDeep LearningライブラリKerasの紹介でした。日本ではあまり話題になっていないようでQiitaではまだ5件くらいしか投稿がない・・・今後しばらくは海外のサイトに潜入していろんな人のKerasによる実装から最先端の手法を勉強していきたい。
Keras関連の記事(NEW!)
- 深層学習ライブラリ Keras(2016/3/28)
- Kerasはじめます(2016/10/18)
- Kerasのインストール(2016/10/24)
- Kerasによる2クラスロジスティック回帰(2016/10/30)
- Kerasによる2クラス分類(Pima Indians Diabetes)(2016/11/3)
- Kerasによる多クラス分類(Iris)(2016/11/8)
- KerasでMNIST(2016/11/9)
- Kerasによる畳み込みニューラルネットワークの実装(2016/11/20)
- KerasでCIFAR-10の一般物体認識(2016/11/27)
- Kerasによるデータ拡張(2016/12/12)
- KerasでVGG16を使う(2017/1/4)
- VGG16のFine-tuningによる犬猫認識 (1)(2017/1/8)
- VGG16のFine-tuningによる犬猫認識 (2)(2017/1/10)
- VGG16のFine-tuningによる17種類の花の分類(2017/1/31)
- 畳み込みニューラルネットワークの可視化(2017/2/16)
*1:GoogleのTensorflowも調べてみたがこれもTheanoと同じ低レイヤのライブラリでこれを使って高度なアルゴリズムをスクラッチから記述するのは同様にきつい