import numpy as np
import random
import chainer
from chainer import serializers, cuda, Function, gradient_check, Variable, optimizers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
model = L.Linear(2, 1)
opt = optimizers.SGD()
opt.setup(model)
for i in range(10000):
x0 = random.random()
x1 = random.random()
x = Variable(np.array([ x0,x1 ], dtype=np.float32).reshape(1, 2))
y = Variable(np.array([ x0+x1 ], dtype=np.float32).reshape(1, 1))
# loss = F.mean_squared_error(model(x), y)
loss = (y - model(x)) ** 2
model.zerograds()
loss.backward()
opt.update()
print( model.W.data )
print( model.b.data )これはおまじないである
model = L.Linear(2, 1)L は chainer.links のエイリアスであった (おまじない)L.Linear は線形関数である
L.Linear(2,1) は shape=(m,2) な入力 x を受け取って shape=(1,m) を返す関数であるm は俗にバッチサイズと言われる
m=1 という定数だと思っておくW とベクトル b を持つx に対して Wx+b を計算する機構を中に持つ
__call__ であるmodel.W とかでアクセスできるmodel というのは単に、2つの実数 (np.float32) を受け取ったとき、なんやかんやして、1つの実数 (np.float32) を返す機械であるopt = optimizers.SGD()
opt.setup(model)model は2つの数を受け取って1つの数を返すものである x0 = random.random()
x1 = random.random()
x = Variable(np.array([ x0,x1 ], dtype=np.float32).reshape(1, 2))
y = Variable(np.array([ x0+x1 ], dtype=np.float32).reshape(1, 1)) # loss = F.mean_squared_error(model(x), y) # こういうのもある
loss = (y - model(x)) ** 2 # 自分で書いても良い
model.zerograds()
loss.backward()
opt.update()F の下にいくつか用意されている
F.mean_squared_error があるVariable であることに註意model の .grad パラメタを初期化してprint( model.W.data )
print( model.b.data )model はとても単純で線形関数であった
model.W と model.b との2つしかない[[ 0.99998778 0.9999873 ]]
[ 1.44174519e-05]