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

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

O'REILLY『れロから䜜るDeep Learning』3ç«  ニュヌラルネットワヌクで7セグメントならぬ4セグメントLEDを認識させおみた

䜕幎か前から半幎に1冊のペヌスで専門曞を読もうずしおいる。専門曞ず蚀っおも、倧孊12幎くらいの難易床だが。

今読んでいるのは『れロから䜜るDeep Learning ―Pythonで孊ぶディヌプラヌニングの理論ず実装』である。気づいたこずを゚ントリヌにしおいるのだが、気づいたら前回の蚘事から3ヶ月も経っおしたっおいた。

watto.hatenablog.com

3章でニュヌラルネットワヌクずいうのを導入する。早い話が行列挔算である。その他いく぀かの準備をするず、次はいきなり「MNISTデヌタセット」ずいう手曞き数字のテストデヌタを認識させる。

ここが、ずおもわかりにくかった。プログラム蚀語 Python で曞かれたコヌドがGitHub からダりンロヌドでき、挔算䞭のデヌタが奜きなずころでダンプできるので、テキストには茉っおいないテストルヌチンを远加しお随所でデヌタをダンプしたりしながら、ようやく䜕をやっおいるのか理解した ぀もり。

理解するっお、どういうこずなのかね しばしば蚀われるこずだが、「理解する」ずいうこず自䜓が、最も理解しがたいものの䞀぀なのかも知れない。

本圓に理解しおいるかどうかを確認するために、緎習問題を䜜っお解いおみるずいうのは、よく行われる手段だず思う。䞊掲曞では2章でANDゲヌト、ORゲヌト、NANDゲヌトずいう論理回路をパヌセプトロンこれもぶっちゃけ行列挔算であるで実珟しお、そこからいきなりMNISTデヌタセットにチャレンゞする。難易床が断厖絶壁のように倉化する。

䞭間はないんかい っおこずで、難易床はそうずうに䞋がるが、7セグメントLEDをニュヌラルネットワヌクで認識させられないかず考えた。

手を぀けおみたら、7セグメントLEDでもかなり耇雑なこずになりそうだった。それでさらに難易床を䞋げお、4セグメントLEDずいうのを考えるこずにした。

 

4セグメントLEDずいうのは、こういうものである。そんなものがあるかどうか知らないけど、私が考えたのだいいじゃないか。

f:id:watto:20170522230412p:plain

名前の通り4぀のLEDから構成される。䞀番䞊が最䞋䜍ビット、時蚈回りに䞊䜍ビットに察応にしおゆくずする。

䞊掲図の䞀番䞊、すなわち党郚点灯した状態1, 1, 1, 1を「0」ずする。

真ん䞭の0, 0, 1, 0ず䞀番䞋の1, 0, 0, 0は、いずれも「1」ずする。「1」に二通りの衚珟があるずいうのが、いわばミ゜である。

話を単玔にするため「2」「9」は衚珟䞍胜ずする。「7」は、なんずかなりそうな気もするが諊める。

これを、テキストP8486でいうずころの「機械孊習」ではない「人の考えたアルゎリズム」で、認識させようずいうのだ。

スポンサヌリンク

 

 

たずはテキストP6061「第1å±€1番目のニュヌロン」を改造しおみた。コヌドはPythonの察話モヌドに貌り付けが可胜のはずである。

import numpy as np
x = np.array([[1, 1, 1, 1],[0, 0, 1, 0],[1, 0, 0, 0]])
W1 = np.array([[0.3, -0.2, 1.1], [0.3, -0.2, -0.2],
    [0.3, 1.1, -0.2], [0.3, -0.2, -0.2]])
B1 = np.array([-1, -1, -1])
A1 = np.dot(x,W1) + B1

䞊蚘コヌドを行列で衚珟するず、こんな圢になる。

f:id:watto:20170522232808p:plain

倉数 x は入力で、テキストの䟋は2入力だが3入力に改造した。1行目が「0」すなわちビットがすべお1のケヌスに察応する。2行目ず3行目は、それぞれ1ビット目ず3ビット目だけが1のケヌスに察応する。

W1は第1局目の重み、B1は第1局目のバむアスで、「0.3」「-0.2」「1.1」「-1」ずいう数倀は私が適圓に考えた。1列目はビットがすべお1のずきに限り、2列目ず3列目は特定のビット1぀だけが1のずきに限り、正になるような数倀の組み合わせであれば、䜕でもいいのだ。

                 

続いおP6162の「第1局目の掻性化関数」に関しおは、テキストのシグモむド関数ではなく、ステップ関数P47を採甚しおみた。今埌、機械孊習にもチャレンゞしたいず思っおいる。その際にステップ関数ではうたくいかないかも知れないが、今は単玔さ、わかりやすさを優先した。

関数の定矩は、どこでやっおもいい。

def step_function(x):
    return np.array(x > 0, dtype=np.int)

関数を䜿う前に定矩されおいればいいのだ。

Z1 = step_function(A1)

ここで print(A1)、print(Z1) でA1ずZ1をダンプするず、こうなるはずである。

f:id:watto:20170522234914p:plain

Z1が3×3の単䜍行列になっおしたうのが、なんか気持ち悪い。぀か「䜕をやっおるんだろう」感がある。論理回路を䜿った方が早い。それはじゅうじゅう承知なのだが、将来のず蚀っおも5章だが機械孊習を芋すえおパヌセプトロンで論理回路を実珟しおいるこずがキモなのだ。

                 

続いおテキストP6263「第1局から第2局ぞの信号の䌝達」を改造する。やりたいこずは、Z1の2列目ず3列目のORをずっお1列にたずめたいだけである。぀たり、どっちかが1だったら「1」ずいうこずだ。だがこの操䜜が、1局のニュヌラルネットワヌクだけでは䞍可胜だから、倚局のニュヌラルネットワヌクが必芁ずなるわけだ。

遠回りで面倒なこずをしおいる気がするが、あえおやっおみる。くどいようだが埌々の機械孊習のためだ。

W2 = np.array([[1, 0],[0, 0.5], [0, 0.5]])
B2 = np.array([0, -0.2])
A2 = np.dot(Z1,W2) + B2
Z2 = step_function(A2)

W2は第2局目の重み、B2は第2局目のバむアスで、数倀はテキストP2728でパヌセプトロンでORゲヌトを実珟したずきず同じものを、わざず䜿っおみた。

W2ずA2を行列衚珟するず、こうなるはずである。

f:id:watto:20170523002230p:plain

                 

最埌に出力局だが、テキストP63の identity_function ではなく代入を䜿っおみた。理由は単に面倒だったからだ。

y = Z2

これも行列衚瀺。

f:id:watto:20170523003206p:plain

ただしこの結果を、続くテキストP63の「゜フトマックス関数」に適応するのは、よろしくない。LEDの茝床を「0」ず「1」のデゞタルでやっおしたったからだ。パヌセントを甚いれば面癜いかも知れない。今回の堎合は、P80で出おくる np.argmax(y, axis =0) ずいうのを䜿うのがいいんじゃないかな。぀たり行列の最倧芁玠が△行目に出おくるずしたら、△ずいうのが衚瀺された数字だずいうこずで。

                 

最埌に、こんなこずもやっおみた。4セグメントLEDの2の4乗党郚の組み合わせに぀いお、䞊蚘コヌドを詊しおみたのだ。

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

A1 = np.dot(x,W1) + B1
Z1 = step_function(A1)
A2 = np.dot(Z1,W2) + B2
Z2 = step_function(A2)
y = Z2

テキストP79流に行列サむズを衚蚘しおみる。

f:id:watto:20170523005300p:plain

結果の y は 16×2の行列ずしお埗られる。1 が珟れるのは0, 0, 1, 0、1, 0, 0, 0、1, 1, 1, 1に察応する行だけで、それ以倖は党郚 0 だった。これは期埅した結果である。

远蚘

この図解が必芁なのだった。第1局ず第局のやっおいるこずを論理回路で瀺す。

f:id:watto:20170525224634p:plain

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

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

Â