せっかくChainerについて書いているのだが、微分とか、まるで数学の基礎を説明していると読んでいて飽きるだろう。早くChainerでの Deep Learning の方法が知りたいであろう。
ということで、突然ではあるが、紹介した
『Chainerによる実践深層学習』は、書籍中のプログラムも公開されているので、それを利用しながら話を進めようと思う。
最初に行う Deep Learning は、どこへ行ってもIrisの種の分類だ。
Python からとても簡単に使えるようになっているので、Chainerに限らず、多数の書籍の最初のDLのデータがIrisになっている。
だから、ここでも、そのままIrisのデータを用い、3種のIrisの種の分類をやってみる。
プログラム全体はここでは示さない。
『Chainerによる実践深層学習』から、プログラムのアーカイブをダウンロードして見て欲しい。
今回は、その中から、 iris0.py という短い簡単なプログラムについて説明する。
以下に、そのプログラムの、初期化、学習ループ、学習結果の評価の部分だけを掲載する。
なお、適当に変更しているので、オリジナルとは若干違う。
また、Python 3で動くように、printのところは変更している。
# 学習モデルの初期化
model = IrisChain()
optimizer = optimizers.SGD()
optimizer.setup(model)
# 学習ループ
for i in range(10000):
x = Variable(xtrain)
y = Variable(ytrain)
model.zerograds()
loss = model(x,y) # lossを求める (forward)
loss.backward() # 微分(backward)
optimizer.update() # 調整
# Testデータで学習成果を確認する
xt = Variable(xtest, volatile='on') # 学習不要
yy = model.fwd(xt)
ans = yy.data
nrow, ncol = ans.shape
ok = sum([np.argmax(ans[i,:])==yans[i] for i in range(nrow)])
print( ok, "/", nrow, " = ", (ok * 1.0)/nrow ) # 正解率
実行してみよう。
Chainer$ python iris0.py
72 / 75 = 0.96
Chainer$ python iris0.py
68 / 75 = 0.906666666667
Chainer$ python iris0.py
70 / 75 = 0.933333333333
Chainer$
>>>
こんな感じで、プログラムを走らせる度に、学習成果(テストデータの正解率)が異なった。
といっても、いずれも90%を超える正解率になっているので、かなり良い正解率といえるのではないだろうか。
今回は、Deep Learningでよく見る階層に分かれ、層間を多数の線で結んだ図を良く見るであろうが、それに対応するモデルの部分は示さなかった。
プログラムの意味を解説するよりも、プログラムを勝手に変更したり、別のデータを入れるとどんなことになるかなど、真面目に勉強したい人はさっさと書籍を読むであろうから、興味の向くまま勝手な実験を進め、紹介しようと思っている。