前回、学習の進行状況をプリント出力できるようにしたのだが、数字の羅列を見るのは面倒なので、グラフとして見えるようにしよう。
そのために、学習ループの中で、リストresultに、[周回数,学習正解率,テスト正解率]を毎回追加するようにした。
# 学習ループ
result = []
for i in range(100000):
x = Variable(xtrain)
y = Variable(ytrain)
model.zerograds()
loss = model(x,y) # lossを求める (forward)
loss.backward() # 微分(backward)
optimizer.update() # 調整
if i % 100 == 0:
lck = check(xtrain,trans,model)
tck = check(xtest,yans,model)
result.append([i,lck,tck])
print("%6d %6.4f %6.4f" % (i,lck,tck))
lck = check(xtrain,trans,model)
tck = check(xtest,yans,model)
result.append([i,lck,tck])
print("%6d %6.4f %6.4f" % (i,lck,tck))
以上で集めたデータを、matplotlibで表示しやすいように分解し、表示するようにした。
グラフの内容をそのままpngのファイルとして出力もした。
# グラフ
import matplotlib.pyplot as plt
ilist = [d[0] for d in result]
lck = [d[1] for d in result]
tck = [d[2] for d in result]
plt.plot(ilist,lck,color="blue")
plt.plot(ilist,tck,color="red")
plt.savefig("digits0graph.png")
plt.show()
そして出力された画像がこれである。
青が学習データでの成功率で、赤がテストデータでの成功率である。
最初、一気に .90位まで上昇し、その後、上昇ペースがどんどんゆっくりになっている。
青と赤の差が乖離誤差と呼ばれ、この差が激しくなると、過学習に陥っているという。
過学習とは、模擬試験には強いのだが本番はダメとか、練習の王者で本番ではメダルが取れないという感じとでも言えばよいだろうか。