FANNのテスト

PyBrainはあまり速くないので,名前からして速そうなFANN(Fast Artificial Neural Network Library)を試してみる. インストール方法のメモ

Fast Artificial Neural Network Library (FANN)

環境はUbuntu 14.04 apt-getでも取れるがバージョンが2.1.0なので自前でビルドする.

wget http://downloads.sourceforge.net/project/fann/fann/2.2.0/FANN-2.2.0-Source.tar.gz
tar xvzf FANN-2.2.0-Source.tar.gz
cd FANN-2.2.0-Source
sudo apt-get install cmake
cmake ./
make
make install

Python用にラッピングしたものがあるのでこれもインストール.

sudo apt-get install swig
sudo pip install fann2

使ってみる.コードは以下.

from fann2 import *
from fann2.libfann import *

nn = neural_net()
#入力層2,隠れ層2,出力層2のネットワークを生成.
nn.create_standard_array([2,3,1])

#活性化関数をシグモイド関数に設定
nn.set_activation_function_hidden(SIGMOID)
nn.set_activation_function_output(SIGMOID)

#xor.dataから学習用データを読み込んで,エラーが0.01になるまで最大1000回学習させる.100回毎に結果をプリント
nn.train_on_file('xor.data', 1000, 100, 0.01)

#結果を表示
print nn.run([-1,-1])
print nn.run([-1, 1])
print nn.run([1,-1])
print nn.run([1,1])

#保存
nn.save('xor.net')

なお,xor.dataの中身は以下のような感じ.

4 2 1
-1 -1
-1
-1 1
1
1 -1
1
1 1
-1

注意しなければならないのが,neural_netクラスにcreate_standardメソッドは存在するけど使えない.

FANNのCのサンプルコードはfann_create_standard関数を使っているので,これをラッピングしてるものと思われるcreate_standardを使おうとしたがどうもうまくいかない.Pythonのfann2モジュールのソースコードを見るとこのメソッドSwigが自動生成したもので,まじめにラッピングされたものではない.fann2モジュールはあんまり使えない感じだ.例外とかも投げないし.

fann_create_standard_array関数をラッピングしているcreate_standard_arrayメソッドを使わなければならない.

うまくいった場合の結果が以下

ubuntu@ip-172-31-27-81:~/fann$ python test_fann.py 
Max epochs     1000. Desired error: 0.0099999998.
Epochs            1. Current error: 1.2790305614. Bit fail 4.
Epochs          100. Current error: 0.5000000000. Bit fail 2.

~~~

Epochs          900. Current error: 1.0000000000. Bit fail 4.
Epochs         1000. Current error: 1.0000000000. Bit fail 4.
[2.6503965530043108e-261]
[0.9998977176605155]
[0.9998977176605155]
[2.6503965530043108e-261]

error, Bit failの意味はいまいちよくわからない.

PyBrainよりは速いが,使いにくい印象.