stMind

about Tech, Computer vision and Machine learning

MLPのサンプルコードをRegression Problemで動かしてみる

ここで公開されてる3章のMulti Layer Perceptronを使う。実行はipythonで。

A Regression Problem

  • シンプルな関数を使ってサンプル集合を生成し、そのサンプル集合が生成された関数を学習により得る
    • 例ではsin関数

Step by Step

1. データセットを作る
x = ones((1,40))*linspace(0,1,40)
t = sin(2*pi*x) + cos(4*pi*x) + random.randn(40)*0.2
x = transpose(x)
t = transpose(t)

実体はこんなデータ。
f:id:satojkovic:20120416012614j:image

2. 訓練データ、テストデータ、検証データに分ける

40点のデータ集合を50:25:25に分割して、それぞれを訓練データ(20)、テストデータ(10)、検証データ(10)とする。

train = x[0::2,:]
test = x[1::4,:]
valid = x[3::4,:]
traintarget = t[0::2,:]
testtarget = t[1::4,:]
validtarget = t[3::4,:]
3. 学習

入力層のノード数1で、隠れ層のノード数3のMLPで、一定回数(ここでは101)の重みの更新を実行する。outtype='logistic'は、活性化関数としてシグモイド関数を使うためのパラメータ指定。(学習アルゴリズムの式の導出はきちんとまとめておきたいところ)

import mlp
net = mlp.mlp(train, traintarget, 3, outtype='logistic')
net.mlptrain(train, traintarget, 0.25,  101)
4.学習結果

一定回数毎に誤差を表示してみると、確かに誤差が減少していて学習しているというのはわかるが、Iteration10以降は逆に微増になってる。これは、データ数が少ないせいなのか、どれかのパラメータの問題なのか、試してみないといけないな…(まだこのあたりの感覚はないのは課題だ)

Iteration:  0  Error:  21.6186313767
Iteration:  10  Error:  18.7424095681
Iteration:  20  Error:  18.7424187477
Iteration:  30  Error:  18.7424188805
Iteration:  40  Error:  18.7424188975
Iteration:  50  Error:  18.7424189017
Iteration:  60  Error:  18.7424189031
Iteration:  70  Error:  18.7424189035
Iteration:  80  Error:  18.7424189037
Iteration:  90  Error:  18.7424189037
Iteration:  100  Error:  18.7424189037