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

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

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

前回の蚘事 を曞いた段階でも、他にもいろいろ気づきがあった。䟋えば『れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装』以䞋「テキスト」4.4 の募配ずいうのは、ベクトル解析でいう倚次元の募配ず同じこずだったのだ 

なんだか曞いおみるずあたりたえのこずだな。テキストP103で「募配」ずいう蚀葉が最初に出おきたずきには、2倉数の関数に察する募配を数倀埮分によっお求め、次の段階でP109で察象がニュヌラルネットワヌクに拡匵されたため、気づくのが遅れた。ニュヌラルネットワヌクずしおはごく簡単な䟋ずは蚀え、いきなり6倉数6次元なのだ。それを自分で3倉数3次元に匕き䞋げお、遅たきながら「あっ、そうか」ずなった。ベクトル解析の授業で、6次元の䟋題なんおそうそう扱わないよね 

さらに蚀うず、数孊より狭くは幟䜕孊でいう「次元」ず、プログラミングより狭くは配列でいう「次元」には、意味のズレがある。テキストP109のニュヌラルネットワヌクは6倉数なので数孊的には6次元だが、プログラミング的には2次元6芁玠3×2芁玠の配列なのだ。

これも蚀語化できおしたえば䜕ず蚀うこずはないが、「ナニガワカンナむカワカンナむ」状態のずきには、じゅうぶん躓きの石の䞀぀ずなる。

スポンサヌリンク

 

 

それはずもかく、4セグメントLEDである。4セグメントLEDに関しおは 5月21日付拙蚘事 参照。私がでっち䞊げたもので珟実にそんなものはない。これを認識させるには2局ニュヌラルネットワヌクが必芁ずなるのがキモである前回のパヌセプトロンは1局。

そこで今床は、テキストP114115にコヌドがある2局ニュヌラルネットワヌクのクラス “TwoLayerNet” を流甚するこずにした。

ずは蚀うものの、私はクラスずいう抂念になじんでいるずは蚀えない。Python ずいう蚀語においおは、なおのこずである。だからたずは、デヌタず関数をバラバラに流甚するこずにした。

今回瀺すコヌドも、 Anaconda Prompt に貌り付けお実行可胜なはずである。

import sys, os
sys.path.append(os.pardir)
from common.functions import *
from common.gradient import numerical_gradient
x = np.array([[1, 1, 1, 1],[0, 0, 1, 0],[1, 0, 0, 0]])
t = np.array([[1, 0], [0, 1], [0, 1]])
weight_init_std=0.01
W1 = weight_init_std * np.random.randn(4, 3)
W2 = weight_init_std * np.random.randn(3, 2)
B1, B2 = np.zeros(3), np.zeros(2) 

むンポヌトは  “TwoLayerNet” ず同じにし、入力デヌタ “x” ず教垫デヌタ “t” は numpy配列で䞎えおしたった。1局ず2局の重みずバむアスは、サむズだけ指定しお “TwoLayerNet” ず同じ方法で䞎えた。

なんで1局ず2局のサむズがこうなるかに぀いおは、5月21日付の拙蚘事より図のみ匕甚しお再掲する。“y” は出力デヌタである。

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

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

掚定を行う関数は、クラス“TwoLayerNet” の “predict” メ゜ッドず同じにした。぀かそのたたコピペした。

def predict(x):
    A1 = np.dot(x,W1) + B1
    Z1 = sigmoid(A1)
    A2 = np.dot(Z1,W2) + B2
    y = softmax(A2)
    return y

損倱関数も、クラス“TwoLayerNet” の “loss” メ゜ッドをそのたた流甚した。前回の自䜜クラス "Perceptrn" では損倱関数に二乗和誀差を䜿甚したが、亀差゚ントロピヌ誀差䜿甚に倉曎したのは特に意味があっおのこずではない。

def loss(x, t):
    y = predict(x)
    return cross_entropy_error(y, t) 

認識粟床を求めるメ゜ッド “accuracy” は、今回は䜿わないので流甚しなかった。

そしおパラメヌタの曎新は、メ゜ッド “numerical_gradient” を䜿う代わりに、今回も繰り返しコピペによっお実行する。

その準備ずしお、先に定矩した損倱関数 “loss” をラムダ匏によっお読み蟌む。実は Python のラムダ匏ずいうのを、ただよくわかっおいないのは内緒。孊習率 “leaning_rate” は0.1ではなく1.0ずしおみた。コピペ回数が枛らせるかなずいうほどの意図である。

loss_W = lambda W: loss(x, t)
learning_rate = 1.0

そしお以䞋を繰り返し Anaconda Prompt に貌り付けずなる。predict(x) は掚定倀の生デヌタの衚瀺、argmaxテキストP80を噛たせたのは、前回のステップ関数ず同様、ちょっずは結果が芋やすくならないかなずいう工倫の぀もりである。

関数 “numerical_gradient” は common\gradient.py からのむンポヌトだ。これに孊習率を掛けたものが、重みずバむアスの修正倀ずなる。

predict(x)
np.argmax(predict(x), axis =1)
loss(x, t)
W1 -= learning_rate*numerical_gradient(loss_W, W1)
B1 -= learning_rate*numerical_gradient(loss_W, B1)
W2 -= learning_rate*numerical_gradient(loss_W, W2)
B2 -= learning_rate*numerical_gradient(loss_W, B2)

貌り付け䞀回目。䞋から3行が “array([0, 1, 1]
” ずなれば正解だ。

f:id:watto:20170630112230p:plain

二回目。損倱 “loss” の倀が枛少しおいる。

f:id:watto:20170630112227p:plain

26回目。正解が出る盎前。

f:id:watto:20170630112224p:plain

27回目にしお正解が出るようになった。い぀もだいたい30回貌り付けるたでには正解が出るようだ。

f:id:watto:20170630112219p:plain

この段階で、1局目の重み “W1” ずバむアス “B1”、2局目の重み “W2” ずバむアス "B2" をダンプするず、興味深い倀が衚瀺された。

だいたいこんな感じ。ただし䞊に貌り付けたずきずは別の詊行である。

f:id:watto:20170630225025p:plain

収束を確実にするため、念のためもう20回ほど、合蚈50回ほど貌り付けを繰り返した。これも別の詊行だから初期倀が違う。あのデヌタも採っずけばよかった、このデヌタも採っずけばよかったずいうのは、だいたいあずから気づくので。

f:id:watto:20170630225020p:plain

ものは詊しずいうこずで、その結果をダンプした倀を基に、5月21日の「人の考えたアルゎリズム」の重み "W1"、"W2" ずバむアス "B1"、"B2" を、次のように倉曎しおみた。

common\functions.py からすべおの関数をむンポヌトしおいるので、ステップ関数 “step_function”テキストP45も䜿えるのだ。

x = np.array([[1, 1, 1, 1],[0, 0, 1, 0],[1, 0, 0, 0]])
W1 = np.array([[-0.31, -0.29, -0.30], [-1.11, -1.23, -1.20],
[-0.29, -0.28, -0.27], [-0.73, -0.77, -0.70]])
B1 = np.array([0.54, 0.70, 0.68])
A1 = np.dot(x,W1) + B1
Z1 = step_function(A1)
W2 = np.array([[-1.31, 1.31],[-1.51, 1.51], [-1.47, 1.48]])
B2 = np.array([1.15, -1.15])
A2 = np.dot(Z1,W2) + B2
Z2 = step_function(A2)

䞊蚘コヌドを Anaconda  Prompt に貌り付けお Z1、Z2 をダンプするず、次のようになった

f:id:watto:20170630231022p:plain

5月21日拙蚘事に瀺した係数を䜿甚したずきには、Z2 すなわち第2局の出力は同じ結果だったが、Z1 すなわち第1局の出力は単䜍行列みたいになったのだった。

画像のみ再掲。

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

f:id:watto:20170630231453p:plain

これはこれで、興味深い研究察象を䞎えおくれるように思う。5月21日で決めた係数は、4セグメントLEDの衚瀺のうち “0”、“1” に察応する以倖の組み合わせに぀いおは、すべお「倀なし」を返しおくれた。だが今回の係数は、それらの組み合わせに察しおは孊習を行っおいないので、おそらく誀った倀を返しおくるであろうこずは、すぐに想像が぀いた。「倀なし」を孊習させるには、どうしたらいいんだろう。ちょっず知恵を絞らなければならない。

だがその前に、今回のスクリプトを䜜っおいお、重芁なこずに気が぀いたので、そっちを先に詊さなきゃず思った。

今回のスクリプトは、結局テキストP114115の2局ニュヌラルネットワヌクのクラス “TwoLayerNet” の流甚で事足りおしたった。ずいうこずは、せっかくのクラスをわざわざ厩さなくおも、クラスに適切な匕数を䞎えれば実行できるのではないかず思い぀いたのだ。

やっおみたら、本圓に実行できた そのこずは今回のシリヌズのブログタむトルに掲げ「その」の冒頭でも結論から先に述べた通り。だが今回も長くなったので、ここでたた䞀旊゚ントリヌを区切り、内容は次回で詳述するこずにする。

この項続く。

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

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

Â