2017年 02月 15日
# Testデータで学習成果を確認する
def check(data,answer,model):
xt = Variable(data, volatile='on') # 学習不要
yy = model.fwd(xt)
ans = yy.data
nrow, ncol = ans.shape
ok = sum([np.argmax(ans[i,:])==answer[i] for i in range(nrow)])
return (ok * 1.0)/nrow # 正解率
データ、正解、モデルを与えると、このモデルを使ってデータを評価し正解との一致率を返す。# 学習データ(xtrain,ytrain)とテストデータ(xtest,yans)に分ける
index = np.arange(N)
xtrain = X[index[index % 3 != 0],:]
ytrain = Y2[index[index % 3 != 0],:]
trans = Y[index[index % 3 != 0]] # 追加
xtest = X[index[index % 3 == 0],:]
yans = Y[index[index % 3 == 0]]
必要な追加は済んだので、最後の部分を書き換えた。
# 学習ループ
for i in range(10000):
x = Variable(xtrain)
y = Variable(ytrain)
model.zerograds()
loss = model(x,y) # lossを求める (forward)
loss.backward() # 微分(backward)
optimizer.update() # 調整
if i % 1000 == 0:
print("%6d %6.4f %6.4f" % (i,check(xtrain,trans,model),check(xtest,yans,model)))
print("%6d %6.4f %6.4f" % (i,check(xtrain,trans,model),check(xtest,yans,model)))
Chainer$ python3 digits0ck.py 0 0.0751 0.0634 1000 0.5601 0.5309 2000 0.6820 0.6477 3000 0.7821 0.7379 4000 0.8297 0.7863 5000 0.8706 0.8280 6000 0.8890 0.8715 7000 0.9040 0.8765 8000 0.9124 0.8865 9000 0.9249 0.8948 9999 0.9316 0.9032 Chainer$
226000 0.9958 0.9666 227000 0.9958 0.9666 228000 0.9958 0.9699 229000 0.9958 0.9716