学習メモ】ゼロから作る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にありますのでそれを実装させます

x1x2y
001
011
101
110
図2-2 ANDゲートの真理値表

この内容を出力させるので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回路 を実装します
重みが違うだけなので、ぱぱぱっとコーディングします

真理値表

x1x2y
000
010
100
111
ANDゲートの真理値表
x1x2y
000
011
101
111
図2-4 ORゲートの真理値表

テスト

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回路は普通のパーセプトロンとは違いますのでまとめておきます

真理値表

x1x2y
000
011
101
110
図 2-12 XORゲートの真理値表

テスト

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