2018年1月10日 星期三

Python Deep Learning 深學筆記 - MNIST 資料集

←前一篇     後一篇→

驗證佮開發仝款重要
咱學一項物件,  無論你是學趣味--ê 抑是欲賺食, 總是愛有法度驗證你學ê物件有路用--無. 若學規半晡 , 紲干焦會當家己歕雞胿講家己偌gâu, 這就毋是科學 ê 精神.

神經網路閣較是按呢生.

毋過佇咧開發階段, 欲按怎了解佇咧初步階段到一个坎站, 就先看家己開發 ê 方向有走精去--無?


另外, 若是欲教學, 予學生作實驗,  欲按怎設計咧?

咱需要一寡教具, 佇這本書: Deep Learning|用Python進行深度學習的基礎理論實作  ê 作者, 提供咱一咧真好資料庫: MNIST 資料集

MNIST 資料集

MNIST (台羅:Em-ni-sut) 資料集是佇網路公開 ê 資料集 (database). 佇機器學習領域中方, 是名聲蓋響亮. 伊是數字 0 到 9 ê 圖片組成, 有 6 萬張訓練圖片, 1 萬張測試圖片. 

訓練圖片是予你用來訓練你 ê 機器. 佇咱 ê Python Deep Learning 課程中, 機器就是咱寫个神經網路程式.

測試圖片是予你用來測你个機器 ê 程度: 予伊看圖, 伊看著 ê 數字著--無?

MNIST 佇網路 ê 地址是: http://yann.lecun.com/exdb/mnist/


欲按怎使用 MNIST 資料集

既然伊是一咧圖片 ê 資料集, 伊都是牽涉著電腦欲按怎處理影像 (image) ê 智識, 閣有欲按怎使用 Python ê 工具 (Module, function) 來處理影像 ê 智識. 這若是欲講起來就話頭長, 咱這馬先欲注心佇深學這个學問本身, 所以知影按怎使用就好. 若有需要 ê 智識, 咱拄著才閣來了解就好--阿.

MNIST 資料集, 愛去網路頂仔kā伊捎--轉來, 佇這本冊 ê 作者已經寫好一个現成 ê Python ê 式來做這項大誌, 這囥佇伊書內佮 ê github 網頁:

https://github.com/oreilly-japan/deep-learning-from-scratch

你會使用 git 命令kā伊搝--落來:(所以頭一擺運行愛 kā 你的電腦連出去網路)

git clone https://github.com/oreilly-japan/deep-learning-from-scratch

才閣去予伊 ê mnist_show.py 起行:

cd deep-learning-from-scratch/ch03
python3 mnist_show.py

你就會看著:

我佇 Ubuntu 17.10 看著 ê 這个 "5", 是足細足細, 有用貓鼠 kā 伊小可搝較大咧.
你若是去伊 ê dataset/ 目錄, 你會看著加 4 ê gz 檔:

$ ls deep-learning-from-scratch/dataset/
__init__.py    lena.png   mnist.py     t10k-images-idx3-ubyte.gz  train-images-idx3-ubyte.gz
lena_gray.png  mnist.pkl  __pycache__  t10k-labels-idx1-ubyte.gz  train-labels-idx1-ubyte.gz

彼就是去網路頂搝--落來--ê.

書頂面有解說講 mnist.py 是按怎寫--ê. 若有興趣會當去讀. 毋過, 我想重點是 欲按怎使用 load_mnist() 這个寫好 ê 函式, 咱測試會使用著, 佇 mnist_show.py 咱就有看著伊的使用是真簡單, 這是伊的原始碼:

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 設定搜揣路草,予咱揣會著 dataset
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image


def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

img = x_train[0]
label = t_train[0]
print(label)  # 5

print(img.shape)  # (784,)
img = img.reshape(28, 28)  # kā img 成做 28*28 ê 陣列, 為著欲顯--出來
print(img.shape)  # (28, 28)

img_show(img)

咱小來解說這个程式个內容:

sys.path.append(os.pardir)

是共你的頂一棧目錄加入去 Module ê 搜揣路草. 咱用 cd deep-learning-from-scratch/ch03 來去予 python3 mnist_show.py 起行deep-learning-from-scratch/ch03/ 就是現此時/目前目錄(current directorypython 程式本身起行 ê 路徑os.pardir 是頂一沿(upper layer), 也就是 deep-learning-from-scratch/.
因為咱欲使用 ê load_mnist() 是囥佇  deep-learning-from/scratch/dataset/所致愛共搜揣路草設懸一棧.

dataset/ 規个子目錄, 就是定義一組 module, 伊的名是 dataset. dataset.mnist 就是去共 dataset/mnist.py 內面寫好的物件捎--入來!


load_mnist() 介紹

load_mnist() 是真重要 ê 函式, 愛共伊小了解一个:

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False,one_hot_label = False)

咱看伊會落尾會擲轉來 (x_train, t_train), (x_test, t_test).

神經網路有兩的崁站: 訓練 (training) 佮測驗 (test), (x_train, t_train) 是訓練用--个. (x_test, t_test) 是測驗用--个.

x_train 是規組訓練个圖, t_train 是圖 ê 內容. x_train[i] ê 圖若是 5, t_train[i] 就是數字 5. in 兩个攏是陣列 (array)

flatten 是欲共資料抹予平--無? 因為本底一張圖是 28x28 ê 二維陣列, 共伊抹予平就是仝款 ê 資料, 毋過共伊降低維度, uì兩維陣列成做相連紲 ê 28*28 = 784 ê 孤維陣列.

normalize 是欲 kā 圖內底逐个 pixel (台羅:Phí-sòo) 个數字範圍限制佇 1 來底--無?本底若是一个 Phí-sòo, 數字範圍是 0~255. normalize 了後就成做 0~1 之間.

one_hot_label=True/False 是予你指定正確答案 t 表示个形式. 若是 True, 掠準 3 是 t[123] ê 答案, t[123] = [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]. 若是 False, t[123] 就是 3 爾爾. 這也是愛看佗一種表示較合用.

這寡選項是和圖形處理按怎做較好有關係, 咱這馬先照咧做.


我 ê mnist_show-mine.py

為著予家己較熟手一咧, 嘛閣較了解 load_mnist(), 我小可改 mnist_show(), 予伊印較濟圖出來, 程式囥佇遮: mnist_show-mine.py:

簡單是kā 28x28 ê 圖, 佇 y 方向一直疊--起哩. 這當然是愛小可了解圖佇電腦--裡, 陣列是按怎表示, 才予咱人看有?
你看, 平平是 1, 有向前小可仔斜斜(tshiâ), 嘛有向後略略仔䖙䖙, 有个一屑屑仔鬚鬚, 抑是彎彎. 這對咱人來講無問題, 攏是 1. 毋過對機器來講, 就是大問題.

2018年1月9日 星期二

Android 手機仔安裝 Oruxmaps

若是頭一擺來我, 建議你先來遮踏話頭.


定定peh山个人, 攏會安裝 Oruxmaps (台羅: Óo-luk-mè)這个軟體.

伊是一種地圖軟體, 伊使用 ê 地圖是一種離線地圖. 和 Google 地圖無仝, Google 地圖是囥雲頂, 行到佗, 才隨時uì Google server 搝落來. 所以, 你个手機隨時攏愛黏佇網路!

離線地圖毋免. 伊是全部囥佇你个手機裡. 就算你入去飛航模式, 嘛是會用得!

伊是免費, 自由ê軟體. 毋過, 毋知為啥乜, 你無法度佇咧 Android 頂仔 ê Google Play免費安裝, 看伊的網頁, 干焦是違反 Google 付費 ê 政策. 毋過, 咱猶原會使 uì 伊的網頁直接安裝:

Ourmaps 安裝

佇手機頂, 用 Google Chrome 開 Ourmaps ê 官方網站: http://www.oruxmaps.com/, 你會看著幾落个版本, 現此時我看著个是 7.2.1, 揤:


伊就會自動共伊 ê APK 檔搝--落來, 順徙問你欲安裝--無? 你應好就好阿

安裝臺灣 peh 山地圖

拍開 Taiwan TOPO 網頁, kā 網頁徙到到這个所在:

OruxMaps OruxMaps 自動安裝


我 ê 電信商是中華電信, 所以直接點 Map, Style 伊就會自動安裝.
我 ê 方案是食甲飽, 所以愛去 OruxMaps 內个 "整體設定->地圖->Wifi下載" 共伊禁khiah.

Map 安裝

你點 Map 了後, 看來袂振袂動, 毋通閣亂揤, 莫離開 OruxMaps, 伊這馬當佇 kā 地圖搝落來. 你若用指頭仔, uì 螢幕上頂懸, 向下跤捋落來, 會看著伊當佇 "下載中", 耐心等伊結束. 若是離開 OruxMaps, 安裝就斷--去囉!

Style 安裝

kā Map 仝款, 毋過siű--一个就結束阿.

DEM 安裝

這就愛用手動阿.
咱先共伊搝落來囥佇手機阿裡, 才閣kā伊 kok-pì (Copy) 入去 Oruxmap 內底:

若是 Chrome, 你就揤落載(下載), 伊就會儉去手機裡
揣一个檔案管理軟體, 若是無, 去 Play Store 起 "file manager", 就會出現幾落--ê, 揀一个來用, 我是用 ASUS ZenUI ê 檔案管理.

拍開 ZenUI 檔案管理軟體, 你會看著 moi-hgt-v3.zip. 佇 moi-hgt-v3.zip 點兩个, 閣點 "解壓縮", 伊就佇現此時 ê 目錄解--開, 伊个路草是 sdcard>Downoad>moi-hgt-v3/.


入去 sdcard>Downoad>moi-hgt-v3/, kā 全部 ê hgt 檔選--起來, 才閣佇正爿頂面揤 "移動至" 或 "複製到", 才閣揤 "內建儲存空間->oruxmaps->dem", 落尾揤 "確定" 就好阿!


看地圖有安裝好勢--無?

佇 "切換地圖->OFFLINE" 你會看著 MOI_OSM_TAIWAN_TOPO_RUDY(MAPSFORE), 若無看著, 小揤頂懸兩个箭頭佇圓箍仔內底 ê 更 (Refresh), 若看會著, 就揤一个換--過去.




閣紲落來換 style (華語: 風格), 這佇我的安裝, 和影片無仝, 是愛揤正手頂仔彼三條線 ê 細圖, 才閣揤 Mapfsforge風主題, MOI_OSM:

另外, 嘛是會使uì "地圖調整->Mapsforge風格主題" 來改!

你會使設定欲看偌濟物件: "地圖調整->Mapsforge風格主題->微調Mapsforge主題", kā你想欲看 ê 物件勾起來.

若是想欲看山 ê 影跡, 就是去 "地圖設定->Mapforge設定->增加山坡陰影" 共伊勾起來!

按呢生就全部結束阿, 落尾, 建議是共 cache 摒挕捒 "地圖設定->重建地圖快取"

.

安裝日本地圖

有時欲出國, 若有通安裝離線地圖, 嘛袂䆀.
用 Google chrome 開 https://www.openandromaps.org, 入去了後, 揤 Map Downloads-> Asia, MiddleEast, 共網頁趨落去下面, 有一个表, 有真濟國家.


揣著日本, 揤頭前彼个 "+", 就有真濟安裝方法予你揀:



我揀 Android on OruxMaps, 伊就自動開始安裝阿! 仝款, 愛有耐心小等一个, 會當用指頭仔 uì 螢幕頂捋落來, 你會看著掠地圖 ê 進度條:
等到結束, 就完成阿, 你會使去 "切換地圖" 看日本地圖 JAPAN_ML(MAPFORGE):


這馬, 你會使揀伊來看日本地圖, 你會予伊顯示日文/英文, 干焦揤 "地圖調整->Mapforge地圖語言"

2018年1月1日 星期一

Python Deep Learning 深學筆記 - 輸出棧 ê 一寡討論



請共教育部閩南語常用辭典開--咧,隨時會當查。

輸出棧 ê 設計和你欲解決 ê 問題款有關係

神經網路想欲解決ê問題普通分做分類問題迴歸(台羅:huê-kui, 英文: Regression)問題.
普通欲解決迴歸問題使用恆等函數, 分類問題用 softmax (Sòo-hu-mak-su)函數.

分類問題是欲kā輸入 ê 資料分開, 比如講, 一張人相是查埔抑是查某--ê?

回歸問題欲解決 ê 問題, 伊的數字是相連紲--ê, 比如講, 看相片來臆看覓彼个人是幾公斤

恆等函數 (identity function, 台羅:hîng-tíng hâm-sòo) 是啥乜攏無做, 原汁原味, kā 輸入直接擲出來. softmax 函數需要較濟討論

Softmax 函數 ê 討論

咱佇知影 softmax ê 數學式是:

{\displaystyle f(x)={\frac {1}{1+e^{-x}}}}

這是穩藏棧神經元个使用. 若是佇上尾輸出, 對其中一个神經元, 咱會kā改做:

y(k) = exp(a[k]))/sum(exp(a[0]), exp(a[2]), ..., exp(a[n-1]))
      where k: 0 <= k <= n


a[0]...a[n-1] 表示所有輸出神經元中方 ê 一个.



咱真簡單就看會出來, 若是kā y(0)...y(n-1) 攏 kā 伊加起來, 伊就是 1. 所致, 逐个輸出神經元就親像一个事件發生 ê 機率

佇電腦頂仔寫 Softmax 函數 ê 奇巧

softmax 函數理論真簡單, 毋過佇電腦頂運行有伊的限制. 這時, 你就會怨嘆數學無學予好. 因為有一寡電腦問題, 毋是用電腦智識會當解決--ê.

當然, 有數學家 ê 研究, 咱干焦利用 in ê 成果就好!

數學頂 ê 指數(kí-sòo) 運算, 磕袂著就會有位數 (uī-sòo) --出來 ê 問題 (overflow). 因為數學是理論, 所以有無限大  ê空間. 毋過, 電腦會當處理 ê 數字, 是有限--ê.

咱會使參考網路上這篇:
事實上, 原作者寫了真好, 挺好參考 3.5.2:

建議逐个去買來看.

佇遮我就無閣介紹數學推算 ê 過程, 干焦介紹伊个 Python 寫法:

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a/sum_exp_a

    return y


Python Deep Learning 深學筆記 - Python 實作 3 棧 ê 神經網路



請共教育部閩南語常用辭典開--咧,隨時會當查。
若是英文, 我會用斜體, 來表示


完整 ê 網路數學式

咱佇前一篇知影: 神經網路 ê 訊息, 是一棧一棧傳落去. 頂一棧和下一棧中方, 是 Matrix (台羅:
Mé-tshui ) ê Dot (台羅: tot) 運算. 佇遐, 為著予 dot ê 觀念會當清楚浮--起來, 我有減省 bias (台羅:Pài-o-sù)戛火函式, 這馬愛共伊添--轉去. 咱這馬看完整ê圖:



佇逐个神經元輸出ê時, 愛先經過戛火函式. 逐擺行到下一棧, 除了 Matrix ê dot 運算,閣有一个 bias (紅色) 愛添落. 這馬 0.5, -0.1, 0.2 只是用來做例表示伊是常數, 毋是一定是按呢!

較愛注意个是: 上尾欲輸出 ê 時, 彼咧戛火函式有可能和進前無仝. 這是因為欲用佗一个戛火函式, 愛看你想欲解決啥乜問題. 這馬我閣無啥乜經驗, 咱先 kā 這做法囥佇心肝頭, 後擺才閣沓沓仔來了解.

咱用前一篇學著 ê dot 表示法來表示這張圖:

X ● W1 + B1 = A1
h(A1) = Z1

Z1 ● W2 + B2 = A2
h(A2) = Z2

Z2 ● W3 + B3 = A3
σ(A3) = Y

其實, 就是重複三擺 dot, 加 bias, 閣用戛火函式處理這咧過程, 咱這馬會使開始寫阿!


頭一版 ê Python 實作

若是照咱頂仔 ê 算式, 就是真直覺:

A1 = np.dot(X, W1) + B1
Z1 = sigmoid(A1)

A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)

A3 = np.dot(Z2, W3) + B3
y = identity_function(A3)

其中,  sigmoid() 和 identity_function() 是戛火函式. 紲--落來, 就是賰定義 W1, W2, W3 這三个權重, B1, B2, B3 這三个 Pài-o-sù 就好阿!

咱較佮意 kā 權重和 Pái-o-sù 獨立出來佇一開始都寫好, 囥佇 init 函式內底, 下跤是完整 ê 例: network.py, 和原文 ê 仝款:


import numpy as np

def sigmoid(x):
    return 1 / ( 1 + np.exp(-x))

def identity_function(x):
    return x


def init_network():
    network = {}
    network[ 'W1' ] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
    network[ 'B1' ] = np.array([0.1, 0.2, 0.3])
    network[ 'W2' ] = np.array([[0.1, 0.4], [0.2, 0.5] , [0.3,  0.6]])
    network[ 'B2' ] = np.array([0.1, 0.2])
    network[ 'W3' ] = np.array([[0.1, 0.3], [0.2, 0.4]])
    network[ 'B3' ] = np.array([0.1, 0.2])

    return network

def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    B1, B2, B3 = network['B1'], network['B2'], network['B3']

    A1 = np.dot(x, W1) + B1
    Z1 = sigmoid(A1)

    A2 = np.dot(Z1, W2) + B2
    Z2 = sigmoid(A2)

    A3 = np.dot(Z2, W3) + B3
    y = identity_function(A3)

    return y

network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)

forward() 這个函式名, 是講這種訊號行徙ê方式, 是向前(ǹg-tsîng). 日後, 咱會閣學著向後(ǹg-āu).

佇遮, 咱使用著 Python ê 字典 (dictionary), 咱會使去參考線頂个 Python Doc. 若有需要, 我才閣另外寫一篇來紹介.

network() 這个函式名, 伊內底 ê 數字, 就是咱現此時个神經網路!

小結

到今(kàu-tann), 咱uì一个簡單 ê 三棧神經網路, 咱會當知影:

  • 伊是一棧一棧傳訊號(sìn-hō)--ê. uì頂一棧到下一棧是 Matrix ê dot 運算
  • 咱關心个是輸入和輸出, 中方 ê 棧, 是隱藏 ê 棧
  • 利用 Python ê NumPy, 欲寫出神經網路 ê 向前處理 (forward process), 毋但看起來屧貼, 好寫好理解. 伊運行起來嘛真好效率. 這是因為伊佇處理陣列 ê 運算真!



2017年12月30日 星期六

Python Deep Learning 深學筆記 - uì 神經元成做神經網路



請共教育部閩南語常用辭典開--咧,隨時會當查。
若是英文, 我會用斜體, 來表示

複習

咱佇進前討論--ê, 攏是神經元 (Perceptron) ê 性質, uì 伊个定義, 行到  Ló-tsi̍k (Logic), 基本 ê Ló-tsi̍k-ké(Logic Gate), 到較複雜 ê Ek-Óo-ké (XOR Gate).

這寡攏是簡單一个神經元 ê 性質. 簡單兩个輸入, 會產出啥物輸出, 親像下跤這張圖按呢 :

伊个表示是:

y = 1 if (w1x1 + w2x2 - θ ≦ 0)  
y = 0 if (w1x1 + w2x2  - θ > 0 )


紲落來咱閣學戛火函數, 會使kā伊整做一 ê 函式來表示:
a = w1x1 + w2x2 + b    (佇遮 θ= -b)
y = h(a)


實際上就是:


y = h(w1x1 + w2x2 + b)

這馬咱欲kā伊闊, 因為誠實 ê 網路是一个輸入, 會佇仝時間刺激濟个神經元. 親像下跤這張圖:



這時, 咱是欲按呢寫三改:

y1 = h(w11 x1 + w21 x2 + b1)
y2 = h(w12 x1 + w22 x2 + b2)
y3 = h(w13 x1 + w23 x2 + b3)

咱先莫插 h() , kā伊當做 h(x)=x ê 恆等函數 (identity_function), 就是啥乜攏無做, 原本不動,

y1 = w11 x1 + w21 x2 + b1
y2 = w12 x1 + w22 x2 + b2
y3 = w13 x1 + w23 x2 + b3


咱愛知影, w1, w2 逐組攏無仝, 所致咱愛用較複雜 ê  w11, w12,...方式來標示, 咱人較袂花--去阿. 

若是閣較濟神經元, 規千規萬, 閣較濟棧, 干焦標示, 都舞袂了阿, 欲按怎分析佮發展咧?  

敢有較屧貼 ê 表示和做法咧?


用濟維陣列來表示兩棧 ê 變化

佇頂仔彼三的數學式, 咱若kā伊整理一个, 成做:



這就是佇前一篇講个 dot 運算. 按呢, 輸入和輸出 ê 關係會使用較媠氣 ê 寫法:

X ● W = Y 

佇遮, X 就是 x1, x2..., xN ê 集合, W 和 Y 嘛仝款, 咱調整 X 和 W, 就是調整這个神經網路.


三棧 ê 網路

這馬若是咱閣加一棧咧?

三棧 ê 網路, 咱會使 kā 伊看做是 (X -> Y), (Y -> Z) 兩个兩棧網路 kā 伊敆--起來.


X ● W1 = Y 
Y ● W2 = Z 

這 W1, W2 是兩組權重.

紲落來一篇, 咱才來介紹欲按怎用 Python 實做





2017年12月26日 星期二

Python Deep Learning 深學筆記 - 2 維陣列 ê 運算



請共教育部閩南語常用辭典開--咧,隨時會當查。

今仔日這篇, 是單純介紹 2 維陣列 (2-dimension Matrix) ê  運算. 這是單純數學ê概念, 閣加一寡使用 Numpy 來計算2 維陣列 ê 方法. 若是你本底就會曉親像 Dot 運算 (華語: 內積, 台羅: tat 運算, 抑是點運算), 這對你就真簡單.

啥mi̍h是 2 維陣列 (Matrix)?

2 維陣列 (英文: Matrix, 台羅: Mé-tsuī-khū-sù, 簡單講 Mé-tshuì), 華語有時嘛翻做矩陣 (台羅: kú-tīn), 就是kā一陣數字排做伙, 干焦軍隊踢正步按呢四正仔四正, 逐个數字攏有伊佇咧直个算來第幾个, 橫ê算來第幾个ê位置, 咱舉一个例:


伊是一咧兩逝三排 ê 矩陣. 你 uì 逝(row) 看去, 伊是兩个一維陣列. uì 排(column) 看去, 伊是三排一維陣列, 這 2 和 3, 就號做伊的維度. 咱先來用 Numpy 做一咧Mé-tshuì:

>> A = np.array([[1, 2, 3 ], [4, 5, 6]])
>> A.shape()
(2, 3)

你會當看著 (2, 3), 表示伊是一个 2x3 ê Mé-tshuì.

毋過, 佇 Python 內底, 抑是真濟其他 ê 程式語言內底, 伊佇排順序个時, 攏是uì 0 開始, 所以, 咱這馬都會使佮 1, 2, 3, 4, 5, 6 佇這个 Mé-tshuì ê 位置寫綴佇數字邊阿:

抑就是咱若是予kā這个 Mé-tsuì 名叫 A, A(0,0) 就是 1, A(1,2) 就是 6. 若是干焦 A(0), 就是 kā 規个 row 0 (lóo-lîng) 掠出來
>> A[1, 2]
6
>> A[0]
array[1, 2, 3]


Matrix ê Dot 運算 (台羅:Tot)

有人是 kā 伊講做 "乘", 毋過, 對 Matrix 來講, 咱真僫用整數 "乘" 个概念來了解伊, 我是感覺用英文 (Dot) 音譯就好--阿. 當然, 你欲講 "點" 運算, 抑是華語直翻 "內積" 嘛由在你. 總--是, 有人用上重要, 濟人用上重要. 用久, 自然會產生共識. 上驚就是討論規半工, 堅持家己, 落尾連家己嘛無用, 閣旋轉去用華語, 按呢是來亂--ê--nih?

咱這馬先用一个 2x3 和 3x2 ê Matrix 做 tot 運算內做例:

Tot 運算是按呢: kā tot (*) 倒手爿 ê Mé-tshuì ê 逝, 和伊正手爿 ê Mé-tshuì ê 排, 有對同 ê 元素做乘法, 才閣 kā 乘出來 ê 數字合--起來, 成做落尾結果 ê 元素.

[1,2,3] 是 0 逝, [ 7, 8, 9 ] 是 0 排, 結果 1*7+ 2*8+3*9 = 50 就囥佇 (0, 0)
[1,2,3] 是 0 逝, [ 10, 11, 12 ] 是 1 排, 結果 1*10+2*11+3*12=68 就囥佇 (0, 1)
[4,5,6] 是 1 逝, [ 7, 8, 9 ] 是 0 排, 結果 4*7+ 5*8+6*9 = 122 就囥佇 (1, 0)
[4,5,6] 是 1 逝, [ 10, 11, 12 ] 是 0 排, 結果 4*7+ 5*8+6*9 = 167 就囥佇 (1, 1)

所以咱會使知影:
1. * 前仔 ê 排, 和後壁 ê 逝, 數目愛仝款. 比如講: 2x3 tot 3x2, in ê "3" 是仝--ê.
2. 算出來新ê Mé-tshuì, 伊个維度是前仔彼咧 ê 逝 ê 數目, 和後壁彼个 ê 排 ê 數目, 比如講: 2x3 tot 3x2, 結果是 2x2 ê 維度, 中方 ê 3 佇運算過程中消失去--阿.


用 Numpy 來做 Dot 運算

參考 matrix2.py,  numpy ê dot 運算是 numpy.dot()

import numpy as np

A = np.array([[1,2,3], [4,5,6]])
B = np.array([[7,10],[8,11],[9,12]])
print(A.shape)
print(B.shape)
result = np.dot(A, B)
print(result)

伊个結果是:

$ python3 matrix2.py 
(2, 3)
(3, 2)
[[ 50  68]
 [122 167]]




2017年12月22日 星期五

Python Deep Learning 深學筆記 - 戛火函數 (Activation function)



請共教育部閩南語常用辭典開--咧,隨時會當查。



為啥乜愛有戛火函數?

咱先複習進前 ê 神經元函數

y = 1 if (w1x1 + w2x2 ≦ θ)
y = 0 if (w1x1 + w2x2  > θ)

抑是伊个變化, 

y = 1 if (w1x1 + w2x2 - θ ≦ 0)  
y = 0 if (w1x1 + w2x2  - θ > 0 )

攏總是愛兩个分開 ê 函式才有法度表示. 按呢生佇數學, 理論, 抑是實作上有無四序 ê 所在. 咱敢會使 kā in 合合做一咧函式來表示都好? 這咧時陣, 就是戛火函式欲上台 ê 時機囉!

簡單講, 咱希望有一咧函式是:

a = w1x1 + w2x2 + b    (佇遮 θ= -b)
y = h(a)

佇遮, 咱愛先有一咧觀念: 戛火函式毋是干焦一个標準答案, 較早 ê 專家已經揣出幾落个, 咱佇遮先介紹三个.


戶橂函數 (Step function)


上直接 ê 寫法, h(x) 就是:

y = 0 if x < 0
y = 1 if x >= 0

佇遮, 咱先來利用 matplotlib 和 numpy kā 伊畫--出來, 請參考 step.py:

#!/usr/bin/python3
def step_function(x):
    return np.array( x > 0, dtype=np.int)

import numpy as np
import matplotlib.pylab as plt

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)    # siat-tīng y kuainn ê huān-uî
plt.show()

這个 step_function 其實就是 y = 1 if x > 0, y = 0 if x <= 0, 伊毋若處理一个數字, 閣會當處理 numpy ê 陣列. 這是使用 ê 奇巧, 逐个kā伊抾轉去用.

$ python3 step.py

你會看著:

Sigmoid (Sik-moo-i)函式

咱看著戶橂函式是無連紲(discontinous)函式, 因為uì x 是 0 到 x > 0, 直接 uì 0 跳到 1, 你揣無任何 x 會使予 y 變做 0.5, 0.9.
這个 Sigmoid (台羅: Sik-moo-i) 函式是相連紲 ê 函式:


{\displaystyle f(x)={\frac {1}{1+e^{-x}}}}

咱來 kā 伊畫出來較有感覺, 干焦 kā 進前戶橂函式中的 step_function 換掉就會用得, 這是 sigmoid.py:

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

運行 python3 sigmoid.py 你會看著:

Sik-moo-i 函式和戶橂函式上大ê無仝是: 伊是相連紲 (continuous) ê 函式. 佇實際使用, 相連紲 ê Sik-moo-i 較有路用. 這是因為大自然本底就是相連紲--ê.

ReLU (Lé-lù) 函數

ReLU (台羅: Lé-lù), 是最近較衝, 較定定用个. 

h(x) = 0 if x <= 0
h(x) = x if x > 0

伊个特色是 x > 0 是線性--ê. 伊个 python 函式寫法是: (relu.py)

def relu(x):
    return np.maximum(0, x)

看來真簡單, 著毋? 這是愛有一點仔數學 ê 技巧, 知影 Lé-lù 其實就是 h(x) = x, 閣一點仔程式設計 ê 經驗, 這是愛加寫, 加看高手寫个程式, 學伊的手路, 加思考, 才有法度佇咧一兩逝 ê 程式, 予人感覺輕輕鬆鬆問題就解決--阿!

這是伊畫出來 ê 圖:



佇 Linux 來看GPX 檔案

最近定定有戶外活動。使用𤆬路機 (GPS) 來記錄行過的路線。普通我記錄路線,攏是用手機仔抑是專門个𤆬路機,罕得用電腦來看。 毋過,"仙人拍鼓有時錯,跤步踏差啥人無"。有一擺我無細膩,袂記得共一擺活動的路線收煞起來,閣直接開始記錄下一擺的活動,按呢共幾落...