PyBrain による XOR の学習

In [1]:
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised import BackpropTrainer

モジュールのインポート。

In [2]:
ds = SupervisedDataSet(2, 1)
ds.addSample((1, 1), 0)
ds.addSample((1, 0), 1)
ds.addSample((0, 1), 1)
ds.addSample((0, 0), 0)

教師データの設定。

In [3]:
import numpy as np

def init_weights(n, rang):
    np.random.seed(1)
    return np.random.rand(n)*rang*2. - rang

nn = buildNetwork(2, 2, 1)
nn.params[:] = init_weights(len(nn.params), 1.)

ニューラルネットの作成と重みの初期化。重みの初期化は勝手にやってくれるが、ランダムで再現性がないし、値の範囲を指定できないので、ここでは手動で初期化している。

In [4]:
from tqdm import tqdm
from matplotlib import pyplot as plt
%matplotlib inline

trainer = BackpropTrainer(nn, ds, learningrate=0.01, momentum=0.)

error0 = trainer.train()
errors = [error0]

for i in tqdm(xrange(1, 100000)):
    error = trainer.train()
    relerror = error/error0
    
    errors.append(error)
        
    #if i % 1000 == 0:
    #    print('%5d %e %e' % (i, error, relerror))
    
    if error < 1e-4 or relerror < 1e-8:
        break
        
print('%5d %e %e' % (i, error, relerror))

plt.yscale('log')
plt.plot(errors);
 12%|█▏        | 11558/99999 [00:42<04:43, 311.90it/s]
11569 9.998444e-05 2.123164e-04

学習。誤差が十分に小さくなるまで繰り返す。

In [5]:
print("%d %f" % (0, nn.activate((1, 1))))
print("%d %f" % (1, nn.activate((1, 0))))
print("%d %f" % (1, nn.activate((0, 1))))
print("%d %f" % (0, nn.activate((1, 1))))
0 0.020320
1 0.987452
1 0.987454
0 0.020320

学習結果の確認。