Pythonでニューラルネットワーク
この記事に書かれている事
Pythonによるニューラルネットワークの実装
はじめに
ニューラルネットワークについてとても親切に解説されているサイトが公開されていたので、
Pythonで実装しました。
また、テストコードとしてsin関数の関数近似を行ってみました。
__author__ = 'emoson' import numpy as np def sigmoid(x, beta=1.0): return 1.0 / (1.0 + np.exp(beta * -x)) def d_sigmoid(x, beta=1.0): return beta * x * (1 - x) def linear(x): return x def d_liner(x): return 1 class MultilayerPerceptron: def __init__(self, in_size, h_size, o_size): self.w1 = np.random.random([h_size, in_size + 1]) self.w2 = np.random.random([o_size, h_size + 1]) def fire(self, x): h = sigmoid(np.dot(self.w1, np.insert(x, obj=0, values=1.0).T)) o = linear(np.dot(self.w2, np.insert(h, obj=0, values=1.0, ).T)) return h, o def bp(self, x, t, eta): h, o = self.fire(x) delta_o = (t - o) * d_liner(x) delta_h = d_sigmoid(np.insert(h, obj=0, values=1.0, axis=0)) * np.dot(delta_o, self.w2) d_w2 = eta * np.outer(delta_o, np.insert(h, obj=0, values=1.0, axis=0)) self.w2 = self.w2 + d_w2 d_w1 = eta * np.outer(delta_h[1:], np.insert(x, obj=0, values=1.0, axis=0)) self.w1 = self.w1 + d_w1 def batch(self, X, T, epoch_max): for epoch in range(epoch_max): for x, t in zip(X, T): self.bp(x, t, 1.0 - (epoch / epoch_max)) def online(self, X, T, epoch_max): for epoch in range(epoch_max): i = np.random.randint(0, len(X)) self.bp(X[i], T[i], 1.0 - (epoch / epoch_max))
このプログラムを用いて、sin関数を近似すると次のようになります。
近似関数を求めるとバックプロパゲーションの正しさを比較的容易に確認できるので良いですね。
次は多層パーセプトロンの学習則の記事を書きたいなぁ。