2018年4月14日 星期六

Python Deep Learning 深學筆記 - 損失函式


←前一篇     後一篇→

損失函式(Loss function)是用來計算神經網路个輸出, 到底精差偌濟? 凡勢無仝个應用, 愛揀無仝个損失函式. 譬如講, 認聲音裡个字, 和認圖裡个數字, 損失函式無仝. 這嘛和輸出棧个樣有關係. 你欲認 0~9 十个數字, 和欲認人面, 嘛是無相siâng.

現此時佇這本冊的例是用認捌 0~9 做例, 伊的輸出棧是 10 粒神經元, 逐粒代表一个數字, 咱就先就這个例來紹介.


均方誤差 (Mean squared error)

這是上蓋出名的損失函式, 伊的數學算式是:

佇遮 y 是神經網路輸出, t 是訓練資料. k 是維度. 咱佇咧遮有 0~9 十个輸出, 伊的維度就是 10.
咱先轉去看進前彼篇的例:ch03/neuralnet_mnist.py, 共伊小改一个來共伊的過程看予斟酌:

import sys, os
sys.path.append(os.pardir)  # 設 module 搜揣路草
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax


def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    return x_test, t_test


def init_network():
    with open("sample_weight.pkl", 'rb') as f:
        network = pickle.load(f)
    return network


def predict(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 = softmax(a3)

    return y


x, t = get_data()
network = init_network()

for i in range(100):
    y = predict(network, x[i])
    print(list(map(lambda x:round(x,1), y)))


伊會印出逐擺資料的輸出結果. 因為這是訓練好的資料, 所以大部份攏是 0, 正確的答案伊會真接近 1, 但是咱有時嘛會看著:

[0.0, 0.0, 0.0, 0.0, 0.40000001, 0.0, 0.0, 0.0, 0.0, 0.5]
[0.0, 0.0, 0.2, 0.69999999, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0, 0.89999998, 0.1, 0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.60000002, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, 0.0]

若是抑袂訓練好, index 0~9 就會攏有數字, 咱揀一兩个來算伊的均方誤差:

import numpy as np
def mean_squared_error(y, t):
    return 0.5 * np.sum((y-t)**2)

y1 = [0.0, 0.0, 0.2, 0.69999999, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
t1 = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
y2 = [0.0, 0.0, 0.0, 0.0, 0.89999998, 0.1, 0.0, 0.0, 0.0, 0.0]
t2 = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

print(mean_squared_error(np.array(y1), np.array(t1)))
print(mean_squared_error(np.array(y2), np.array(t2)))

伊的結果是:
0.065000003
0.010000002

愈細表示愈接近正確的答案, 佇遮, y2 較倚!

Khu-ló-sù Én-tso-phì 精差 (Cross Entropy Error)

Cross Entropy Error 是另一个四常用个損失函式, 伊的公式是按呢:


咱先來看 y = log(x) 个圖生做啥乜款?

#!/usr/bin/python3
import numpy as np
import matplotlib.pylab as plt

x = np.arange(-0.0, 1.0, 0.001)
delta = 1e-7
y = np.log(x + 1e-7) 
plt.plot(x, y)
plt.ylim(-5, 0)    # siat-tīng y kuainn ê huān-uî
plt.show()

運行這个程式, 出現:



log(1) 是 0, x < 1 是負數, 愈接近 0, 伊就負愈大. log(0) 是毋成數, 窮實, 伊是負个無限大, 咱共伊標做 -inf. 毋過, 這電腦無法度算落去, 咱共伊添一个 1e-7 這个微微仔數來閃過這个問題.

若是看 croess entropy error 本身: 若是完全對同, 比如講 3, t3 會是 1, 賰的 t0~t2, t4~t9 攏是 0, 所致成做 E = -t3 * log(y3), log(1)=0, E 是 0 表示完全無精差.

咱來計算看覓頭前个例:

#!/usr/bin/python3
import numpy as np
def cross_entropy_error(y, t):
    delta = 1e-7
    return -np.sum(t * np.log(y+delta))

y1 = [0.0, 0.0, 0.2, 0.69999999, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
t1 = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
y2 = [0.0, 0.0, 0.0, 0.0, 0.89999998, 0.1, 0.0, 0.0, 0.0, 0.0]
t2 = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

print(cross_entropy_error(np.array(y1), np.array(t1)))
print(cross_entropy_error(np.array(y2), np.array(t2)))


伊的輸出:
0.356674815367
0.105360426769

伊的值, 和均方差無仝, 毋過猶原是 y2 較接近.

批次學習

到今, 咱討論ê是一擺訓練个誤差有偌大. 若是開始訓練, 咱會揀一批一批, 一批訓練了, 才規批來算伊有偌準, 所致:


就是共 N 个攏加--起來, 才閣分做 N 來平均. 紲落來 ê 問題是: 欲按怎 <凊彩> 揀 N 出來咧?

若以 MNIST 有 60000 筆資料, 咱一擺揀 100 筆來訓練, N 是 100. Numpy 有一个 random.choice() 函數, 會使共咱鬥做這个 '凊彩揀' 个工課:

batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_maskmask]
t_batch = y_train[batch_mask]

train_size=600000, batch_size=100, batch_mask 是 10 个元素的 Numpy array, 逐个元素攏是 0~60000 个數字. 閣利用進前 Numpy array 索引 (Fancy indexing), 真輕可就共欲挃个物捎--出來.


 伊的 cross_entropy_erorr(y, t) 就愛修改:

def cross_entropy_error(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
    batch_size = y.shape[0]
    return -np.sum(t * np.log(y)) / batch_size

這 if y.ndim == 1 所做的 reshape, 是 Numpy array 个一个鋩角, 你若毋知, 會使去, 搜揣 <鋩角> 兩字就知.

按呢修改, 伊就仝時支援 "干焦一筆資料" 和 "濟筆資料". 為啥物? 因為濟筆資料, 伊是成做 2 維陣列, 逐个列 row 是一筆資料. 干焦一筆 y.ndim==1, 100 筆 y.ndim == 100. Numpy array 个運算攏是逐个元素相對同 (element-wise), 所致, 一擺就攏算好阿. np.sum() 也是一改就攏總加--起來



方法確定了後, 就是訓練个循環:

  1. 揀一批資料, 共資料飼予咱的神經網路, 算看覓伊的平均誤差是偌濟? 
  2. 閣修正 W 這个陣列
  3. 閣揀另外一批資料, 轉去 1, 看誤差有變較細--無?

紲--落來, 欲按怎予 W 佇咧調整个過程中方, 愈來愈倚正確个答案, 也就是損失函式愈來愈細? 這就愛uì微分个觀念開是講起!




2018年4月1日 星期日

Python Deep Learning 深學筆記 - 予神經網路學習

←前一篇     後一篇→

你若是這个系列對頭開始讀到今, 算是到一个崁站: 咱進前講个攏是神經網路的基本結構. 佇頂一篇, 咱展現這个結構, 會使認个出來 MNIST 資料集裡的數字. 閣紲落來, 欲介紹个是: 欲按怎共咱的神經網路牽教, 予伊學習咧?

用資料學習


咱人个學習, 上直接就是不斷的刺激, 反應, 修正. 你敢知ê你家己个神經按怎去調整伊家己? 毋知, 你就是目睭看世界, 咱共你講彼是啥, 你就記起來. 咱講彼个聲是啥, 你共伊記咧.
佇神經網路, 若是決定好幾棧, 逐棧个數目, 欲按怎輸入和輸出, 賰的問題就是決定伊的權重 W1, W2, W3, ... 个數字. 你無法度一个一个家己指定, 你愛用攢好个資料飼--伊, 看伊反應按怎, 予伊家己修正 W1, W2, .. 這寡權重.

這寡資料咱事先攏有正確的答案, 會使和伊的回答做比較, 一方面看伊學習个成果, 一方面嘛是看紲落來欲修正个方向.
若是捌學過控制理論, 對這種圖一定真熟:






這是一種經典的 feedback (closed-loop) 的概念圖. 雖然伊是用佇電子電路, 毋過伊的概念是天跤下共通个.

咱共小改一个, 予伊用佇神經網路頂懸:


這馬, 咱就注心佇咧揣出 E 欲按怎來改變 W 个原理和方法.
一開始, 咱愛揣出方法來算出輸出佮正確答案到底是偌倚? 咱愛有一个數學/函式, 會使算出个客觀數字, 這佇神經網路是損失函式(Loss Function).
紲落來, 欲按怎改變 W 咧? 這就是愛用著微積分(Bî-tsik-hun) 个觀念



2018年3月3日 星期六

佇 Ubuntu Artful 17.10 頂仔安裝 rubyripper


因端

我慣勢佇 CD 買--轉來了後, kā 伊內底个歌掠出來, 轉做 MP3 抑是其他个格式, 成做家己个資料庫 (database), 才閣捒起雲頂, 親像 Google Music, 按呢生我用手機就會使隨時聽.

往過我攏是用 itune 來轉. 這當然是因為 Apple 自 ipod 開始, 就是隨身音樂的領導者, itune 嘛誠實好用, 伊 uì 掠音軌, 轉檔, 輸入歌个資料, 親像歌名, 作詞者, 專輯名,甚至專輯封面, 攏真好勢用.

毋過對我來講, 唯一麻煩 ê 所在是: 伊無出 Linux 版本. 較早我攏是開 Virtual Box 安裝窗仔門(Windows), 才佇窗仔門頂仔安裝 itune.

毋過, 近--來 itune 佇 Windows 10 頂仔安裝起來煞袂開--得. 掠規半晡掠無摠. 想講應該離搜揣 Linux 頂懸 ê 物件來取代.

需求

我的需求
  • 會當轉出 MP3, 抑是無失真个格式
  • ài支援 id3v2 版本的 mp3 tag
  • ài 支援圖片來做封面
  • ài 支援 batch process
  • 上好是會使 uì 雲頂个 database 直接掠著歌曲ê資料

Rubyripper


我搜揣ê結果, sound-jucier 會使掠, 毋過 mp3 ê tag 傷簡單. 看--來, 掠 CD 音樂 ê 程式和轉檔ài分開. 而且, uì 網路頂仔 ê 討論, 掠 CD 音軌个品質嘛真重要, uì Ubuntu Community CD Ripping ê 討論看--來, Rubyripper 是真濟論壇(lūn-tuânn) 推薦个軟體. 

毋過, ubuntu 个程式資料庫 (repository) 無收 Rubyripper. 所以咱無法度用 apt 輕輕鬆鬆來安裝.

紲--落來, 看有法度揣著捌人款好个包袱仔(package) deb 檔, 若按呢, 咱嘛會使用 dpkg 來安裝(an-tsong). 毋過 uì 伊的官方網站搝(giú)--落來个 deb, 煞傷舊, 裝袂--起來. 紲落尾个辦法, 就是家己 uì 原始碼來起造 (build).


欲按怎 build Rubyripper

首先, uì github kā source code 搝落來:

$ git clone https://github.com/bleskodev/rubyripper.git

紲--落來, 愛安裝起造 binary 需要个包袱仔 (dependent pacakges). 佇 ubuntu 17.10 artful 這个環境中方, 我是按呢做:

$ sudo apt install cdparanoia ruby ruby-gettext ruby-gtk2 cd-discid flac  lame wavpack sox \
cdrdao libcdio-utils vorbisgain ruby-gnome2

行看 ./configure 來看欠啥乜物件:

$ cd rubbyripper
$ ./configure --enable-gtk2 --enable-cli --enable-lang-all


CHECKING FORCED DEPENDENCIES

cdparanoia: [OK]

CHECKING OPTIONAL DEPENDENCIES

ruby-gtk2: [OK]
ruby-gettext: [OK]
discid: [NOT OK]
You won't have accurate freedb string calculation unless Cd-discid is installed.
cd-discid: [OK]
eject: [OK]
flac: [OK]
vorbis: [OK]
lame: [OK]
wavegain: [NOT OK]
You won't be able to replaygain WAVE files.
vorbisgain: [OK]
mp3gain: [OK]
normalize: [NOT OK]
You won't be able to normalize audio files.
cdrdao: [OK]
cd-info: [OK]
ls: [OK]
diskutil: [NOT OK]


Creating the Makefile...
A summary of your settings:

Using the following locations for install:
* Executables: /usr/local/bin
* Localization files: /usr/local/share/locale
* Icon file: /usr/local/share/icons/hicolor/128x128/apps
* Desktop file: /usr/local/share/applications
* Library files: /usr/local/lib/rubyripper

Gtk2 frontend will be installed
Cli frontend will be installed
Languages to be installed: nl, de, fr, hu, ru, es, se, bg, it, da

You can now run make install
Make sure you've got the writing privileges

佇遮, 我是盡量予 [NOT OK] 成做 [OK], 若無, 可能有一寡功能會無正常. 若是欲像我連 mp3gain 嘛 OK, 閣愛裝:

$ sudo add-apt-repository ppa:flexiondotorg/audio
$ sudo apt update
$ sudo apt install mp3gain aacgain

因為 Ubuntu Artfulmp3gain, 所以咱愛 uì 捌人抾好个所在去捎. 這步做了, 閣愛行一擺 ./configure.

落尾, 就是來 build 閣安裝囉!

$ sudo make install

這馬, 你會使起行, 伊有兩種介面: 圖形 (GUI) 和命令列 (CLI), 分別是 rrip_guirrip_cli, 咱開 rrip_gui 看覓:


起行了後,  kā 音樂 CD 囥入去, 揤 Scan drive, 伊就會顯示幾塊歌. 較拍損个是: 伊去 freedb 掠歌个資訊, 是掠無. 所以就愛家己共伊添入去, 閣揤 Rip cd now, 伊就開始kā音軌抽出來囉!


欲轉做啥乜格式?

伊預設是 Vorbis. 你若是欲用捌種, 愛去 Preferences->Codecs->Active audio codecs 設定.

伊支援 mp3, aac, 和 flac 編碼. 我佮意用 flac, 佇 Active audio codecs kā flac 揤 "加入" 添入去, 若無用 Vorbis, 就揤 "移除" kā 伊徙掉就好阿!


欲按怎調整加入封面咧?

這愛和另外个程式配合. easytag 和 kid3 攏袂䆀. 我是較佮意 kid3, 因為伊會使 batch process

2018年1月17日 星期三

Python Deep Learning 深學筆記 - 訓練好个神經網路

←前一篇     後一篇→


佇遮, 咱欲結合學著 ê 神經網路智識, 來認捌前一篇所介紹 ê MNIST 資料集.

一个完整 ê 神經網路智識, 愛有 "學習" 佮 "推論" 兩个階段, 就敢若咱人若是欲會曉一種技術, 嘛是愛先學習, 出師了後, 才開始展工夫. 毋過, 這篇, 干焦有展工夫予你看. 這个神經網路已經訓練好阿. 原作者佇遮, 想欲展示予咱看會是: 咱進前介紹 ê 三棧神經網路, 予伊有夠濟个神經元, 用咱學過 ê Mé-thuì Dot 運算, 閣有定義好个戛火函數, 伊是有法度認捌 MNIST 內底ê資料集--ê.

Python Pickle 功能 ê 介紹

PicklePython ê module, 若是看伊英文說明: "The pickle module implements binary protocols for serializing and de-serializing a Python object structure.", 伊是 kā Python ê 物件 (object) 成做二元 ê 資料水(註1, 看下跤) (serial data stream).  按呢抑是誠抽象.

咱來做一个比喻: 物件 (object) 你會當想做一个立體, 有佔著空間 ê 物件, 親像棉襀被, 椅仔, .... 若是有一个奇術師, 有一條長長 ê 水管, 伊會當 kā 棉襀被硩扁, 縮小, uì 水管頭櫼入去. 紲落來, 嘛 kā 椅仔櫼入去, 紲落來啥乜 li-li-khok-khok 攏照順序櫼入去....

按呢, 立體 ê 物件變做無維度 (dimension) 抑就是無結構 (structure), 敢若親像水佇水管裡排隊, 這就是
資料水 (serial data stream).

會使變做資料水, 當然嘛愛會使變轉來, 若無這个魔術師就失業囉! 變做資料水 ê 過程號做 serializing, 變轉來 ê 過程號做  de-serializing.

講到遮你若是閣霧嗄嗄嘛bua̋i 緊. Pickle ê 意思是 "泡菜/醬菜/豉ê物", 就是會使囥真久袂歹去. 所以  Pickle 就會使予咱用內囥一寡咱做到一半 ê 資料, 先儉起來, 欲食才提出來.

咱進前講个, 這个神經網路, 已經訓練好阿, 作者就先用 Pickle ê 形式儉起來, 咱就 kā 豉好个"泡菜" 提出來食就好阿.

 MNIST ê 推論網路

這愛用著作者 ê 例, 佇前一篇已經有講按怎去 github 掠伊的例, 佇 ch03/neuralnet_mnist.py:

import sys, os
sys.path.append(os.pardir)  # 設 module 搜揣路草
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax


def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    return x_test, t_test


def init_network():
    with open("sample_weight.pkl", 'rb') as f:
        network = pickle.load(f)
    return network


def predict(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 = softmax(a3)

    return y


x, t = get_data()
network = init_network()
accuracy_cnt = 0
for i in range(len(x)):
    y = predict(network, x[i])
    p= np.argmax(y) # 揣 y 內底上大, 也都是機率上大--ê
    if p == t[i]:
        accuracy_cnt += 1

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))
                                                                                                                                                              44,1         底端

get_data() 佇前一篇介紹, 就是去 kā MNIST 捎--入來.

init_network() 就是 kā 咱事先做好个神經網路, 囥佇 ch03/sample_weight.pkl 掠轉來.

predict() 伊个樣都和咱佇 Python 實作 3 棧 ê 神經網路 ê 樣欲相sia̋ng 阿相 siâng. 你看伊嘛是三棧 ê 網路 毋過, 伊 ê 輸入有 784 ê  神經元, 輸出有 10 ê 神經元. 中方藏兩棧, 這隱藏 ê 頭一棧是  50 个神經元, 第二棧是 100 个神經元.

for i in range(len(x)):
    y = predict(network, x[i])
    p= np.argmax(y) # 揣 y 內底上大, 也都是機率上大--ê
    if p == t[i]:
        accuracy_cnt += 1

這个 for loop, kā 測試 ê 資料用  predict() 來臆, 咱个 10 ê 輸出神經元, 對應到 0~9  十 ê 數字, 佗一个 ê 機率上大, 就是伊--阿. 才閣和答案 t[i] 比看著抑是毋著

這是佇我的電腦ê運行結果:

$ python3 neuralnet_mnist.py 
Accuracy:0.9352

佮書上仝款. 0.9352 就是正確率 93.52%.

電腦就是電腦, 訓練煞就袂改變. 咱人有可能彼工心情無好結果會變無仝.

你看, 生做攏仝款 ê 神經元, 經過訓練, 就會認 0~9 ê 圖片. 訓練是改變啥物咧? 就是神經網路 ê  權重 W, 佇遮是 W1, W2, W3. 欲按怎調整 W1, W2, W3? 這就是神經網路 ê 手路, 咱就愛繼續看落去!

註1: 定定聽序大人講 "錢水活", 表示華語講个 "金流很大". "水" 這个字佇台語, 本底就有 "流" ê 意思. 和英文 ê flow/stream, ê 意思嘛真合. 當然, 你欲添一 ê "流" 也是會使啦!

←前一篇     後一篇→

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


佇 Linux 來看GPX 檔案

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