Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Python DeepLearningに再挑戦 1

概要

何度かやろうと思って挫折した、python のdeeplearningに再挑戦してみる。

参考書籍

まず環境を準備する。

  • pyenvでanaconda3-2.5.0 の環境を作成する。
  • jupyter notebookをinstallする
  • pillow をinstallする
  • matplotlibをinstallする

他にも必要があったら適宜入れていく。

パーセプトロン

パーセプトロンは、複数の信号を入力として受け取り、一つの信号を出力する。 単純なものを図にすると以下のような感じらしい。

f:id:riikku:20161219135405p:plain

数式だと以下のような感じ。

         0  (w1x1 + w2x2 <= θ
y = {
         1 (w1x1 + w2x2 > θ

w1x1+w2x2 の合計が、閾値θの値を超える場合は1を返し、閾値以下の場合は、0を返す という単純なもの。

ちょっと数式はどうやって表現したらいいかよくわからんな。。

ANDゲート

f:id:riikku:20161219140525p:plain

例えば、w1,w2, θ = 0.5, 0.5, 0.7 の時などがある。

0.5*0 + 0.5*0 = 0
0.5*0+ 0.5*1 = 0.5
0.5*1 + 0.5*0 = 0.5
0.5*1 + 0.5*1 = 1.0 

になるので、ANDゲートを満たす。
 ```

## NANDゲート ORゲート

[f:id:riikku:20161219141406p:plain]


NAND ゲートを満たすものの例

(w1,w2,θ) = (-0.5, -0.5, -0.7)

-0.50 + -0.50 = 0 -0.7より大きいので1を返す -0.51 + -0.50 = -0.5 -0.7より大きいので、1を返す -0.50 + -0.51 = -0.5 -0.7より大きいので、1を返す -0.51 + -0.51 = -1.0 -0.7より小さいので、0を返す

ORゲートを満たすものの例

(w1, w2, θ) = (0.5, 0.5, 0.4) 0.5 * 0 + 0.50 = 0 -> 0.4より小さいので、0 0.5 * 1 + 0.50 = 0.5 -> 0.4より大きいので、1 0.5 * 0 + 0.51 = 0.5 -> 0.4より大きいので、1 0.5 * 1 + 0.51 = 1.0 -> 0.4より大きいので、1

## パーセプトロンの実装

def AND(x1, x2): w1, w2, theta = 0.5, 0.5, 0.7 tmp = x1w1 + x2w2 if tmp <= theta: return 0 elif tmp > theta: return 1

シンプル!

## 重みとバイアスの導入

別の実装方式に変更する。今後こちらの方がやりやすいようだ。
* θ -> b (バイアス)という記号に変更する。
* bを左辺に移動させる。
    0 (b + w1x1 + w2x2 <= 0

y = { 1 (b + w1x1 + w2x2 > 0

b -> バイアス、wを重みという。

import numpy as np x = np.array([0,1]) # numpyのアレイを使う。信号x1,x2 w = np.array([0.5, 0.5]) # 重みw1,w2 b = -0.7 # バイアス wx # w1x1, w2x2 と同じ計算結果 array([ 0. , 0.5]) # w1x1=0,w2x2 =0.5 np.sum(wx) # 総和の計算 w1x1 + w2x2 np.sum(w*x) + b # バイアスを含めた総和の計算 b + w1x1 + w2x2

ちなみに、上記の例だと、np.sum(w*x) + b は、-0.2くらいになって、yは、0を返す。
ANDゲート。

これを踏まえて、再度ANDゲートのfunctionを設定すると以下の通り。

def AND(x1, x2): x = np.array([x1,x2]) w = np.array([0.5,0.5]) b = -0.7 tmp = b + np.sum(x*w) if tmp <= 0: return 0 elif tmp > 0: return 1

NAND, ORは以下の通り

NAND

def NAND(x1,x2): x = np.array([x1,x2]) w = np.array([-0.5,-0.5]) b = 0.7 tmp = b + np.sum(x*w) if tmp <= 0: return 0 elif tmp > 0: return 1

OR

def OR(x1,x2): x = np.array([x1,x2]) w = np.array([0.5,0.5]) b = -0.4 tmp = b + np.sum(x*w) if tmp <= 0: return 0 elif tmp > 0: return 1

## パーセプトロンの限界

XORゲート-> 排他的論理和 
これは、単純なパーセプトロンでは実現できない。

[f:id:riikku:20161219145850p:plain]


## 多層パーセプトロン

XORゲートは、いくつかのパーセプトロンを重ねることで可能になる。

[f:id:riikku:20161219151857p:plain]

## XORゲートの実装

def XOR(x1,x2): s1 = NAND(x1,x2) s2 = OR(x1,x2) y = AND(s1,s2) return y

これだけでOK、便利!

これを重ねていけば、0 と1 で色々なパターンを表現できるので、原理的にはコンピュータを作ることも可能とのこと。