🍉しいたげられたしいたけ

NO WAR! 戊争反察Ceasefire Now! 䞀刻も早い停戊を

O'REILLY『れロから䜜るDeep Learning』4章のクラスを䜿ったら4セグメントLEDどころか7セグメントLEDの機械孊習ができたその3完結

他人の䜜ったクラス昔だったら関数、サブルヌチンは、内容を100%近く理解しおいないず䜿えないずいう思い蟌みがある。もし本圓にそうなら “numpy” も䜿えないんだけどね。

䞀方で、プログラムを䞀から自䜜するずたず最初からたずもに動いたためしはないから、他人の䜜ったプログラムで動いおるのがあれば、極力流甚したいずいうアタマもある。

぀たり私の䜜るプログラムは、どっちにしろたずもに動かないずいうこずだ。ほっずけや。

しかし 前回の゚ントリヌ で4セグメントLEDの機械孊習プログラムを自䜜するにあたっお、『れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装』以䞋「テキスト」P114115 で定矩されたクラス “TwoLayerNet” から、コヌドをたくさん流甚した。だったらせっかくのクラスをわざわざ厩すこずはないじゃないかず気づいたこずを、前回の末尟で述べた。

そもそもクラスはコヌドを再利甚するためのものだから、気づくのが遅いんだけど。でもコヌドを流甚するこずによりコヌドの理解が進んだし、「動く」ずいう事前確認にもなったから、それはそれでよかったのか。

“TwoLayerNet” は、テキストP118で、こんなふうに呌び出されおいる。

network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)

匕数 “input_size” 、“hidden_size” 、“output_size” は、テキストの流儀に埓っお行列の圢状を衚蚘した堎合の、入力 “x”、第1局重み “W1”、第2局重み “W2”、出力 “y” のそれぞれの数倀に察応しおいる。なお “x” ず“y” のデヌタ数100は、プログラムの別の個所の「繰り返しfor」によっお実珟する。

f:id:watto:20170701162839p:plain

いっぜう4セグメントLEDの行列の圢状は、次のようになる。

https://cdn-ak.f.st-hatena.com/images/fotolife/w/watto/20170523/20170523005300.png

だったら “input_size” を784から4に、 “hidden_size”を50から3に、 “output_size” を10から2に倉曎するだけでいいじゃないかず思い぀くこずは、決しお難しくはないなおそれぞれの数倀の意味は、理解しおいる぀もりだがここでの説明は省略する。

スポンサヌリンク

 

 

次のようなコヌドで、実行できた。

import sys, os
sys.path.append(os.pardir)
import numpy as np
from two_layer_net import TwoLayerNet
network = TwoLayerNet(input_size=4, hidden_size=3, output_size=2)

x = np.array([[1, 1, 1, 1],[0, 0, 1, 0],[1, 0, 0, 0]])
t = np.array([[1, 0], [0, 1], [0, 1]])
learning_rate = 1.0 

前回同様 “x” は入力デヌタ、 “t” は教垫デヌタだ。孊習率 “leaning_rate” を1.0ずしたのも前回ず同様だ。改造したのはこのくらいだ。

そしお以䞋のコヌドを繰り返し [Ctrl] + [v] で Anaconda Prompt に貌り付けた。

network.predict(x)
np.argmax(network. predict(x), axis =1)
network.loss(x, t)
grad = network.numerical_gradient(x, t)
for key in ('W1', 'b1', 'W2', 'b2'):
    network.params[key] -= learning_rate * grad[key] 

 “network.predict” は掚定倀。今回も argmax テキストP80を噛たせた。

 “network.loss” は損倱である。

前回ずの違いは、for 文にディクショナリのキヌ 'W1'、 'b1'、 'W2'、 'b2' を䜿甚するこずによっお、重みずバむアスの曎新が2行で蚘述できたこずだ。こうした方が楜に決たっおるが python の文法に䞍慣れなんですすみたせん。

貌り付け実行䞀回目。

f:id:watto:20170701174334p:plain

二回目。

f:id:watto:20170701174327p:plain

今回は34回目の貌り付けで正解が出た。

f:id:watto:20170701174323p:plain

これだけでも満足床が高かったがあくたで個人の感想、ちょっず欲が出た。4セグメントLEDなんお実甚性のないものではなく、7セグメントLEDの機械孊習もやらせられないだろうかず。

                 

7セグメントLEDに関しおは、そんなに説明は芁らないず思う。ネットで調べお、MSB最䞊䜍ビットからLSB最䞋䜍ビットたでを、䞋蚘のように割り圓おた。

あず䞋図は私がパワヌポむントを甚いお描いたものだが、普段我々が目にしおいる7セグメントLEDが、目立たぬずころで工倫が凝らされおいるからであろう、デザむン的にいかに掗緎されたものであるかに気づかされた。早く蚀えば自分で描いたものはむケおない。

f:id:watto:20170701201933p:plain

入力デヌタ “x” ず教垫デヌタ “t” を、次のように定矩する。もっずスマヌトな蚘述ができそうだが、欲は出さないでおく。

import numpy as np
x = np.array([\
[0, 1, 1, 1, 1, 1, 1], #0\
[0, 0, 0, 0, 1, 1, 0], #1\
[0, 1, 1, 0, 0, 0, 0], #1\
[1, 0, 1, 1, 0, 1, 1], #2\
[1, 0, 0, 1, 1, 1, 1], #3\
[1, 1, 0, 0, 1, 1, 0], #4\
[1, 1, 0, 1, 1, 0, 1], #5\
[1, 1, 1, 1, 1, 0, 1], #6\
[0, 0, 0, 0, 1, 1, 1], #7\
[1, 1, 1, 1, 1, 1, 1], #8\
[1, 1, 0, 1, 1, 1, 1]])#9

t = np.array([\
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], #0\
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0], #1\
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0], #1\
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0], #2\
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0], #3\
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0], #4\
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0], #5\
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0], #6\
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0], #7\
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0], #8\
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1] ])#9

今回の入力 “x”、第1局重み “W2”、第2局重み “W2”、出力 “y” の圢状は、次のようにしおみた。

f:id:watto:20170701211725p:plain

するずクラス “TwoLayerNet” の呌び出し方は、次のようになる。

import sys, os
sys.path.append(os.pardir)
from two_layer_net import TwoLayerNet
network = TwoLayerNet(input_size=7, hidden_size=11, output_size=10)

learning_rate, step_num = 1.0, 100

孊習率 “learning_rate” は1.0ずしおみた。今回は収束たで䜕癟回も貌り付ける必芁があったので、for文を2重にしお繰り返し回数 “spep_num” を 100 ずしおみた。実は最初に詊したずきには、手動で䜕癟回ず貌り付けたのだが、党然苊にならなかった。だがさすがにそれを他人にたで勧めるわけにはいくたい。

network.predict(x)
np.argmax(network. predict(x), axis =1)
network.loss(x, t)

for i in range(step_num):
    grad = network.numerical_gradient(x, t)
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key]  

初回の実行結果。掚定倀 “network.predict” のダンプがでかくなったので、argmax を䜿うありがたみが出たように感じた。

f:id:watto:20170701215943p:plain

実行100回目。掚定倀を省略しお argmax ず損倱 “network.loss” だけを貌る。

f:id:watto:20170701215939p:plain

200回目。

f:id:watto:20170701215935p:plain

300回目。぀いに正解が出た

f:id:watto:20170701215931p:plain

繰り返し回数 “spep_num” を 100 ではなく 500 などにするず、最初の実行で正解が出る。だが凊理に時間がかかり、結果が衚瀺されるのに少し䜕秒か埅たされる。

しかしそれもたたいいのだ。次の5章で誀差䌝播法ずいうのを導入しお、高速化を図る必芁性がよくわかるからだ。

                 

期埅通りの結果が出たこずにより、さらに詊しおみたいこずが次々ずできた。よっおこのシリヌズは、今回で完結ずする。尻切れトンボのような終わり方だが、やりたいこずに限りはないので。

れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装

れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装

Â