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]