Chainer:はじめての Deep Learning


2017年 01月 31日

せっかく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でよく見る階層に分かれ、層間を多数の線で結んだ図を良く見るであろうが、それに対応するモデルの部分は示さなかった。
プログラムの意味を解説するよりも、プログラムを勝手に変更したり、別のデータを入れるとどんなことになるかなど、真面目に勉強したい人はさっさと書籍を読むであろうから、興味の向くまま勝手な実験を進め、紹介しようと思っている。