学習メモ】ゼロから作るDeep Learning 2章 パーセプトロン
今回は学習したのでお勉強メモを書いておきます。ソースを消す前に書いておきます。
ついでにpytestのお勉強も合わせてやっております
書籍は「ゼロから作るDeep Learning -Pythonで学ぶディープラーニングの理論と実装-」です
学習内容
学習内容は2章 パーセプトロン
NAND回路、AND回路、OR回路、XOR回路をパーセプトロンで書いています。
実際の内容は… 本文読んでね
本家のソース : https://github.com/oreilly-japan/deep-learning-from-scratch
学習のポイント
書いてるソースをそのまま書いても良いですが、もう一歩進めてみます。
今回は、pytestの勉強を兼ねてTest Firstで作ってみました
学習
書籍を読みながら論理回路だったら先にテストを書くテストファーストでやったほうが面白いかな。
と思ったのでテストフレームワークであるpytestを使ってみました。
テストの内容は真理値表をそのままI/Oを実装すればできるので楽ですね
NAND回路
はじめにNAND回路です。
NAND回路の説明は排除しますが、真理値表は図2-2にありますのでそれを実装させます
x1 | x2 | y |
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
この内容を出力させるのでpytestで書くとこんな感じでしょうかね
from deep_learning_02 import NAND
def test_NAND():
assert NAND(0, 0) == 1
assert NAND(0, 1) == 1
assert NAND(1, 0) == 1
assert NAND(1, 1) == 0
このままでは当たり前ですが、実行してもNGです。
説明が分かりづらいですがERRORなのはわかりますw
本に書いているソースを実装してみます。
import numpy as np
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
これでテストはOKでした!(パチパチ)
AND回路 OR回路の実装
個別に実装と思いましたが実装が近似のAND回路 OR回路 を実装します
重みが違うだけなので、ぱぱぱっとコーディングします
真理値表
x1 | x2 | y |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
x1 | x2 | y |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
テスト
from deep_learning_02 import AND
from deep_learning_02 import OR
def test_AND():
assert AND(0, 0) == 0
assert AND(0, 1) == 0
assert AND(1, 0) == 0
assert AND(1, 1) == 1
def test_OR():
assert OR(0, 0) == 0
assert OR(0, 1) == 1
assert OR(1, 0) == 1
assert OR(1, 1) == 1
実装
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
ちょっと違うXOR回路 (多層パーセプトロン)
XOR回路は普通のパーセプトロンとは違いますのでまとめておきます
真理値表
x1 | x2 | y |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
テスト
def test_XOR():
assert XOR(0, 0) == 0
assert XOR(0, 1) == 1
assert XOR(1, 0) == 1
assert XOR(1, 1) == 0
論理回路の解析
排他論理は少し違いますねん

略書いたらこんな感じですが実際は…

組んでいるので多層パーセプトロンって事になっています。
コード
図の書式を実装すればOKなのでそのまま書いています
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
ひとまず書いている内容はここまでです
終いに
学習するに当たりましてソースは手打ちで勉強するほうが身につくのでソースを書くのが一番なので、
いろいろしていましたが、消すのがもったいないので残してみました。
学習範囲とは違いますがNAND回路,AND回路,OR回路のコードが似ているのでリファクタリングできるのかな?なんて思ったりしますね。
Pytest
インストール
$ pip install pytest
実行
$ pytest test_deep_learning_02.py