[chainer] and論理をニューラルネットで学習する

最近流行りのニューラルネット。自分も興味があるので、こちらを参考にand論理を学習させてみました。ライブラリはchainerを使用してます。
chainerでニューラルネットを学んでみるよ(chainerでニューラルネット2)

import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, Variable
from chainer import optimizers, serializers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L

import sys

class chain(Chain):
# コンストラクタ
def __init__(self):
super(chain, self).__init__(
l1 = L.Linear(2,1) # 中間層2要素、出力1要素
)
# 順伝搬
def fwd(self, x):
h1 = F.sigmoid(self.l1(x)) # シグモイド関数
return h1
# 学習ルーチン
def train(self, x, y, loop):
count = 0
sys.stdout.write("%d\n" % loop)

while (count < loop):
optimizer.zero_grads() # 勾配初期化
loss = F.mean_squared_error(self.fwd(Variable(X)), Variable(Y)) # 順伝搬と損失関数(誤差計算)
loss.backward() # 逆伝搬
optimizer.update() # 重み等のパラメータ更新
count += 1
# カウント表示
sys.stdout.write("\r%d" % count)
sys.stdout.flush()

# 入力と教師ラベル
X = np.array([[0,0],[0,1],[1,0],[1,1]]).astype(np.float32)
Y = np.array([[0],[0],[0],[1]]).astype(np.float32) # and

model = chain() # インスタンス化
optimizer = optimizers.SGD() # 最適化手法として最急降下法を指定
optimizer.setup(model) # おまじない

loop = int(sys.argv[1]) # CUIから学習回数を取得

model.train(X, Y, loop) # 学習

# 学習結果出力
print '\n'
print model.fwd(Variable(X)).data.reshape(1,4), '\n'

学習回数を変化させて実行した結果です。100000回だと一応学習できているといえるでしょうか。中々理屈を理解するところまで至っていませんが、それは追々ということにします。

1 [[ 0.49950463 0.6802026 0.76744843 0.87551677]]
10 [[ 0.49802127 0.40064692 0.35305297 0.26884276]]
100 [[ 0.4654021 0.75355268 0.3602711 0.66420186]]
1000 [[ 0.28072327 0.24871564 0.54001999 0.49895647]]
10000 [[ 0.05792645 0.26004308 0.26310021 0.67111838]]
100000 [[ 8.46922398e-04 8.14700723e-02 8.14700723e-02 9.02733803e-01]]

シェアする

  • このエントリーをはてなブックマークに追加

フォローする