5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ゼロから作るDeep LearningをJuliaで実装してみる (1)論理回路

Last updated at Posted at 2021-09-21

:red_car: この記事の目的

本記事は、Deep Learningの入門書「ゼロから作るDeep Learning」を参考に、Juliaを用いて同書の内容を実装してみる、という試みです。

※これはあくまで筆者の一つの試みと提案で、必ずしも内容が正解ではありませんのでご了承お願い致します。
また、より良いアドバイスや協力のご提案などありましたら、お気軽にお声がけ頂けますと幸いです。

:red_car: 今回取り組むこと

本記事は、参考書の2章にあたります。
今回は以下の基本的な4つの論理回路を実装してみます。
 ①ANDゲート
 ②NANDゲート
 ③ORゲート
 ④XORゲート

①ANDゲート

ANDゲートについては、参考書のp.23に書かれています。
ANDゲートは、真理値表で書くと以下のようになります。
x1及びx2が入力、yが出力です。

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

参考書のソースを元に、Juliaで実装してみます。
wは重み、bはバイアスです。

1_logic_circuit
function AND(x1, x2)

    b = [-0.7]
    x = [x1 x2]
    w = [0.5; 0.5]
    
    calc = x * w + b
    
    if calc[1] <= 0.0
        return 0
    else
        return 1
    end
end

ANDゲートを実装しました。
真理値表通りに動作することを確認します。
image.png
↑上枠(灰色網掛け)が実行部分、下部の数字の並びが実行結果です。
真理値表のyの値通りに動作していることが確認できました。

②NANDゲート

続いて、NANDゲートを実装します。
NANDゲートは、真理値表で書くと以下のようになります。
x1及びx2が入力、yが出力です。

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

NANDゲートの実装は以下としました。

1_logic_circuit
function NAND(x1, x2)

    b = [0.7]
    x = [x1 x2]
    w = [-0.5; -0.5]

    calc = x * w + b
    
    if calc[1] <= 0.0
        return 0
    else
        return 1
    end
end

NADゲートの動作確認を行います。
image.png
上記、NANDゲートの動作確認ができました。

③ORゲート

続いて、ORゲートを実装します。
ORゲートは、真理値表で書くと以下のようになります。
x1及びx2が入力、yが出力です。

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

ORゲートの実装は以下としました。

1_logic_circuit
function OR(x1, x2)

    b = [-0.2]
    x = [x1 x2]
    w = [0.5; 0.5]

    calc = x * w + b
    
    if calc[1] <= 0.0
        return 0
    else
        return 1
    end
end

以下、動作確認です。
image.png
上記の結果、動作確認も良さそうです。

④XORゲート

最後にXORゲートを実装します。
XORゲートは排他的論理和とも呼ばれています。
真理値表は以下となります。
x1及びx2が入力、yが出力です。

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0

XORゲートは、これまで作成したAND,NAND,OR各ゲートの組み合わせで実現できます。
以下のような回路を構成します。
s1,s2はそれぞれNAND,ORゲート通過時の中間値です。
image.png

実装は以下の通りです。

1_logic_circuit
function XOR(x1, x2)
    
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    
    return y
        
end

動作確認の結果は以下の通りです。
image.png

以上で論理回路の実装ができました。
次回は活性化関数の実装に入りたいと思います。

:red_car: もくじ

(1)論理回路
(2)活性化関数
(3)3層ニューラルネットワークの実装
(4)ソフトマックス関数
(5)MNIST手書き数字認識 その①画像表示
(5)MNIST手書き数字認識 その②推論

:red_car: 関連情報

:paperclip: Julia早引きノート[01]変数・定数の使い方
https://qiita.com/ttabata/items/a1ada2c0cba03672e105

:paperclip: Julia - 公式ページ
https://julialang.org/

:paperclip: Julia - 日本語公式ドキュメント
https://julia-doc-ja.readthedocs.io/ja/latest/index.html

:paperclip: 初めてのJuliaとインストール (Windows & Linux)
https://qiita.com/ttlabo/items/b05bb43d06239f968035

:red_car: 出典

■参考書
「ゼロから作るDeep Learning ~ Pythonで学ぶディープラーニングの理論と実装」
 斎藤康毅 著/オライリー・ジャパン
image.png

:red_car: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。

5
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?