from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised import BackpropTrainer
モジュールのインポート。
ds = SupervisedDataSet(2, 1)
ds.addSample((1, 1), 0)
ds.addSample((1, 0), 1)
ds.addSample((0, 1), 1)
ds.addSample((0, 0), 0)
教師データの設定。
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.)
ニューラルネットの作成と重みの初期化。重みの初期化は勝手にやってくれるが、ランダムで再現性がないし、値の範囲を指定できないので、ここでは手動で初期化している。
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);
学習。誤差が十分に小さくなるまで繰り返す。
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))))
学習結果の確認。