Python DeepLearningに再挑戦 1
概要
何度かやろうと思って挫折した、python のdeeplearningに再挑戦してみる。
参考書籍
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
まず環境を準備する。
- pyenvでanaconda3-2.5.0 の環境を作成する。
- jupyter notebookをinstallする
- pillow をinstallする
- matplotlibをinstallする
他にも必要があったら適宜入れていく。
パーセプトロン
パーセプトロンは、複数の信号を入力として受け取り、一つの信号を出力する。 単純なものを図にすると以下のような感じらしい。
数式だと以下のような感じ。
0 (w1x1 + w2x2 <= θ y = { 1 (w1x1 + w2x2 > θ
w1x1+w2x2 の合計が、閾値θの値を超える場合は1を返し、閾値以下の場合は、0を返す という単純なもの。
ちょっと数式はどうやって表現したらいいかよくわからんな。。
ANDゲート
例えば、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 で色々なパターンを表現できるので、原理的にはコンピュータを作ることも可能とのこと。