デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理を基礎からやり直す

Tensorflowの上位ラッパーライブラリ Kerasを試してみる

はじめに

これは、TensorFlow Advent Calendar 2016の16日目の記事です。

本当は、Tensorflowで足し算をやりたかったのですが、間に合いませんでした。足し算といっても桁上りがあるので簡単ではなさそうです。
下記サイトのNPI(Neural Programmer-Interpreters)とか理解できるようになりたいところ。 qiita.com

私がTensorFlowをやるようになったのは、静岡Developers勉強会で2016/4/23「人工知能ハンズオン」を開催するためでした。ともかく流行りで話題になっているのを勉強会として企画したんですが、何も分からない状態で数週間前から準備しただけですから、勢いだけで良くやったよねって感じです。
その時のTensorFlowのインストール記事だけが、未だにアクセス数を稼いでいます。 yaju3d.hatenablog.jp

勢いでやっただけで人工知能は凄いとは思いつつも、数学も苦手だし普通のWindowsのノートPCしかない、MNISTの手書き文字の認識率が高くなったからって何が楽しいのってことでモチベーション的には停滞してました。

そんな中でJoel Grusさんの「Fizz Buzz in Tensorflow」の記事を知ることになります。 これは、プログラマー採用試験としてFizzBuzz問題のプログラムを書きなさいというIT会社面接官に対して「では、まずTensorFlowをインポートします…」というジョークとして話題になりました。つまり人工知能によってFizzBuzz問題を解くという更に高度な提案をしたわけです。
実際に試してみて数分くらいで結果が出て、これは面白いと思いました。これがTensorFlowにちゃんと向き合うきっかけになりました。
FizzBuzz問題はDeep Learning入門としては良い題材と思います。 yaju3d.hatenablog.jp

では、本題に入ります。

Keras とは

KerasはPython製の深層学習ライブラリです。バックエンドとしてTheanoとTensorflowの両方が使え、より高レイヤな表現で深層学習のさまざまなアルゴリズムが記述できる。インドネシア語でkerasは"強い"や"硬い"を意味する ギリシャ語で"角"を意味するそうで読み方は「ケラス」です。
メイン開発者はGoogleのFrançois Cholletさんで迅速な実験を可能にすることに重点を置いて開発されました。 Tensorflowの上位ラッパーライブラリなので、今後はTensorflowよりkerasで書かれたソースが多くなることでしょう。

Keras のインストール

TensorFlow 0.12からWindowsをサポートしたので、Windows版で行います。「TensorFlow 0.12.0rc1」となります。

yaju3d.hatenablog.jp

(tensorenv) c:\Anaconda3>pip install keras

Kerasのインストールエラー

途中で下記のエラーが発生してインストールが止まります。

numpy.distutils.system_info.NotFoundError: no lapack/blas resources found

scipyが悪さしているようなのでインストールします。「pip install Scipy」ではエラーとなったため、「conda install scipy」でインストールしました。その後に再度、「pip install keras」とします。

(tensorenv) c:\Anaconda3>conda install scipy
The following NEW packages will be INSTALLED:

    mkl:   11.3.3-1
    numpy: 1.11.2-py35_0
    scipy: 0.18.1-np111py35_0

Proceed ([y]/n)? y


(tensorenv) c:\Anaconda3>pip install keras
Collecting keras
Collecting theano (from keras)
Collecting pyyaml (from keras)
  Using cached PyYAML-3.12-cp35-cp35m-win_amd64.whl
Requirement already satisfied: six in c:\anaconda3\envs\tensorenv\lib\site-packa
ges (from keras)
Requirement already satisfied: numpy>=1.7.1 in c:\anaconda3\envs\tensorenv\lib\s
ite-packages (from theano->keras)
Requirement already satisfied: scipy>=0.11 in c:\anaconda3\envs\tensorenv\lib\si
te-packages (from theano->keras)
Installing collected packages: theano, pyyaml, keras
Successfully installed keras-1.1.2 pyyaml-3.12 theano-0.8.2

設定ファイルの書き換え

kerasのバックエンドのデフォルトは「Theano」になっていますので、「Tensorflow」に設定ファイルを書き換えます。
設定ファイルは「import keras」を実行した際に作られます。 作られる場所は、下記コマンドで知ることが出来ます。pythonは「CTRL + Z」で停止します。

(tensorenv) C:\Anaconda3>python
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print(os.path.expanduser('~'))
C:\Users\(ユーザー)

「import keras」を実行します。最初に「ImportError: No module named 'keras'」と出たので、「Anaconda Prompt」を起動し直しました。
pythonは「CTRL + Z」で停止します。

(tensorenv) C:\Anaconda3>python
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.

C:\Users(ユーザー).keras\keras.jsonファイルを開きます。
"backend": "theano" → "tensorflow" に変更します。

{
    "image_dim_ordering": "tf",
    "backend": "tensorflow",
    "floatx": "float32",
    "epsilon": 1e-07
}

Keras の動作確認

jupyter notebook を起動します。

(tensorenv) C:\Anaconda3>jupyter notebook

「keras XOR」で検索して見つけたサイトstewartpark/xor.pyソースコードを変更して「AND」に変更してみました。これは「nb_epoch=1000」だと、jupyter notebook上では応答なしになるし、「XOR」だとnb_epochの値を少なくすると正しい値にならないためです。

論理演算をするのに下記サイトではTFLearnという別のライブラリーですが参考になると思います。

qiita.com

清水 亮さんの「はじめての深層学習(ディープラーニング)プログラミング Kindle版」でも論理演算を入門として扱っています。

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
import numpy as np 

X = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([[0],[0],[0],[1]])

model = Sequential()
model.add(Dense(8, input_dim=2))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

sgd = SGD(lr=0.1)
model.compile(loss='binary_crossentropy', optimizer=sgd)

model.fit(X, y, show_accuracy=True, batch_size=1, nb_epoch=100)
print(model.predict_proba(X))

結果ですが、1と1の組み合わせでは0.94108927と1に近い値となっています。他の「OR」や「NAND」や「XOR」もやってみるといいでしょう。

Epoch 100/100
4/4 [==============================] - 0s - loss: 0.0367     
4/4 [==============================] - 0s
[[ 0.0010068 ]
 [ 0.03769387]
 [ 0.03732052]
 [ 0.94108927]]

最後に

TensorFlowにちゃんと向き合うきっかけになった。Joel GrusさんのFizzBuzz問題pydata-chicago 2016の説明用に「keras」を使っています。 github.com www.youtube.com

ちなみにJoel GrusさんのFizzBuzzを動かすのに、下記のインストールが必要でした。

pip install matplotlib
pip install pillow
pip install pyqt5
conda install pyqt=4
conda install h5py

自分としては、FizzBuzzや論理演算や足し算など身近で分かりやすい題材で人工知能に向き合っていくつもりです。下記のような小ネタもたまにはやります。 yaju3d.hatenablog.jp