ニューラルネットワークをGUIで作成して、シミュレーションできるツールSimbrain。このようなニューロン単位でネットワークを構築できるものをはじめて使いました。
そこで簡単な機械学習をやってみました。
http://simbrain.net/
参考: 日経ソフトウェア2017年9月号
この記事はツールの使い方が詳しくかかれており、同じやり方で試してみました。
手順は書籍を参考にしてください。
環境 : Simbrain 3.02 / macOS High Sierra
設定 :
Edit Trainer Settings -> Learning Rate:0.001, Momentum:0.99
Show time series graph properties -> Auto Range:check, Fixed Width:uncheck
学習データ作成用コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#coding:utf-8 import random f1 = open('data.csv','w') f2 = open('classification.csv','w') for i in range(100): x = random.uniform(-1,1) y = random.uniform(-1,1) f1.write(str(x) + "," + str(y) + "\n") if(x>=y): f2.write("1,0\n") else: f2.write("0,1\n") f1.close() f2.close() |
data.csvを入力データ、classification.csvをターゲットデータとします。
xがy以上のとき、1,0 そうでない時0,1というデータを学習させます。
学習が終了したら、Layer1にいろいろな値を入力して判定させます。
Layer2の結果がきれいに1,0にならないときは、うまく判定できていなことを意味するようです。
ニューロンの重みの値を使って結果を確認してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def sigmoid(x): return 1.0 / (1.0 + pow(2.7182818284, -x)) a = 9.101413307861648 b = -9.101413307861648 c = -10.0 d = 10.0 w = sigmoid(a*0.5 + b*0.1) z = sigmoid(c*0.5 + d*0.1) print(w) print(z) w = sigmoid(a*0.2 + b*0.3) z = sigmoid(c*0.2 + d*0.3) print(w) print(z) |
x,y: input(Neuron1,2)
w,z: output(Neuron3,4)
0.974433299385
0.0179862099636
0.286970917472
0.731058578626
ちょっと結果が期待した値とは違いました。やり方がまずいのかもしれません。
(しかしメモとして、おいておきます。)
Simbrain のサイトを見ると、まだまだいろんなことができそうですが、思い通りに使うにはまだまだ時間がかかりそうです。
以下、Pythonで生成した入力データとターゲットデータ。