2017年3月26日 星期日

深度學習(2)--使用Tensorflow實作卷積神經網路(Convolutional neural network,CNN)


    卷積神經網路(Convolutional neural network,CNN),是一多層的神經網路架構,是以類神經網路實現的深度學習,在許多實際應用上取得優異的成績,尤其在影像物件識別的領域上表現優異。

     傳統的多層感知器(Multilayer Perceptron,MLP)可以成功的用來做影像識別,如之前
所介紹,可以用來做MNIST 手寫數字辨識,但是由於多層感知器(Multilayer Perceptron,MLP)在神經元之間採用全連接的方式(Full connectivity),當使用在較高解析度或是較高維度的影像或資料時,便容易發生維度災難而造成過度適合(Overfitting)

     例如,考慮MNIST的手寫輸入資料為28x28解析度,考慮神經元全連接的方式
(Full connectivity),連接到第一個隱藏層神經元便需要28x28=784個權重(Weight)。如果考慮一
RGB三通道色彩圖像輸入,如CIFAR-10為32x32x3的圖像解析度,連接到第一個隱藏層神經
元便需32x32x3=3072個權重(Weight)。那麼如果是200x200x3的圖像解析度,便需要120000
個權重,而這只是連接到隱含層的第一個神經元而已,如果隱含層有多個神經元,那麼連
接權重的數量必然再倍數增加。
     像這樣子的網路架構,沒有考慮到原始影像資料各像素(pixel)之間的遠近,或是密集關係,只是一昧的將全部像素(pixel)當各個輸入的特徵值,連接到隱含層神經元,造成爆量增加的權重不僅是一種浪費,因為實際上不須這麼多的權重,效果不僅沒增加,只是增加了運算的負荷,而且很可能會造成過度適合(Overfitting)。而卷積神經網路(Convolutional neural network,
CNN)被提出來後,可以有效的解決此一問題。

    事實上卷積神經網路(Convolutional neural network,CNN)設計的目標就是用來處理以多陣列型態表達的資料,如以RGB三通道表達的彩色圖片。CNN和普通神經網路之間的一個實質差別在於,CNN是對原始圖像直接做操作,而傳統神經網路是人為的先對影像提取特徵(例如灰階化,二值化)才做操作。

CNN有三個主要的特點。

1.感知區域(Receptive field):可採用3維的圖像資料(width,height,depth)與神經元連接方式,
    實際上也可以直接採用2維的圖像資料,但隱含層內部的神經元只與原本圖像的某一小塊
    區域做連結。該區塊我們稱之為感知區域(Receptive field)

2.局部連結採樣(Local connectivity):根據上述感知區域(Receptive field)的概念,CNN使用過濾
  器(filters)增強與該局部圖形空間的相關性,然後堆疊許多這樣子的層,可以達到非線性
   濾波的功能,且擴及全域,也就是允許網路架構從原圖小區塊的較好的特徵值代表性,組
   合後變成大區塊的特徵值代表性。

3.共享權重(Shared weights):使用的過濾器(filters)是可以重複使用的,當在原始圖像產生一
    特徵圖(Feature Map)時,其權重向量(weights vector)及偏誤(bias)是共用的。這樣可以確保
    在該卷積層所使用的神經元會偵測相同的特徵。並且即使圖像位置或是有旋轉的狀態,
    仍然可以被偵測。

        這三個特點使得CNN在圖像辨識上有更好的效果。在實際操作上的三個基礎分別是:
    區域感知域(Local Receptive field),卷積(Convolutional ),池化(pooling)。
    我們可以從下面圖形化的實際操作來理解它的意思。

卷積層(Convolutional Layer )

      下圖1,2說明在卷積層的運作方式,假設原始影像為一32x32x3維度,我們可以任意給定一
卷積核(filter),其卷積核的值即為權重(weight)。其大小可以為5x5x3,3為與原影像有一樣的深度(RGB三通道),如果輸入影像為一灰階單通道色彩,那麼卷積核大小5x5即可。卷積核大小3x3或5x5或7x7...等等可以自訂,通常為奇數維度。
    接著與原圖像相同的小區域計算點積,得到的一個值便是在新的feature Map的一個新元素值。卷積核會在原始的圖像或者前一個圖像(Map)按照Stride(步伐)的設定移動,直到掃描完全部圖像區域,這樣便會產生一個新的Feature Map。便是下圖圖3~圖5所示,在這個步驟中產生單一新feature Map所使用的權重W,也就是卷積核是共用的,並且共用同一個偏誤(bias),通常初始預設偏誤(bias)可以為0。這樣確保這一新的feature map偵測的是該原始圖像同一特徵。

<圖1>

2017年3月12日 星期日

機器學習(9)--大數據競賽平台Kaggle入門,練習手寫數字辨識

     我們這次利用多層感知器MLP所作的手寫數字辨識,來練習大數據競賽平台Kaggle的投稿方式。在Kaggle上有多項有獎金的項目正在進行,這些項目想必難度很高。另外也有提供入門的練習項目是沒有獎金的,但是有提供了相關數據可以下載,也有人分享了他們實作該競賽項目的方法,這些可以供我們練習及參考。
     接下來我們就練習從Kaggle下載它所提供的手寫數字數據,利用MLP辨識完後把結果上傳回Kaggle平台,它就會馬上幫我們算出辨識準確率及在該項目的排名。

     這邊直接省略註冊步驟,註冊是免費的而且可以直接使用Facebook 或是google+帳號即可,故我們直接從如何下載手寫數字數據開始。
進入Kaggle平台網頁上方選擇[Competitions],底下往下拉即可以看到目前正在進行的競賽項目。
Kaggle平台連結:https://www.kaggle.com/competitions

     如下圖,它有幾種分類,Featured 及Research都是有獎金的,至於新手入門可以從Playground及Getting Started 做起。我們在這邊直接選擇最下方Digit Recognizer 進去。


2017年3月11日 星期六

機器學習(8)--實作多層感知器(Multilayer Perceptron,MLP)手寫數字辨識


    在這章節,我們使用Python實作一多層感知器(Multilayer Perceptron,MLP)來做手寫數字辨識功能。使用MNIST的數據集及反向傳遞演算法(Backpropagation)做模型訓練及測試。並將訓練好的權重存成檔案,以便對新的數據直接作預測,不須每次都重新訓練模型。最後練習使用windows內建的"小畫家"自己手畫數字進行辨識。結果如下圖所示:

<圖一>第1、3列為使用windows小畫家手繪出的手寫數字,第2,4列為相對應的預測結果。




    有關反向傳遞演算法(Backpropagation)的公式推導,可以參閱底下連結:
該連結範例為有帶值的手解計算,作者:Matt Mazur已解釋的非常清楚了,
建議大家可以跟著做一次。
https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

補充:對於啟動函數sigmoid 的求導推導有疑慮的,可以參考我下面手寫證明的方式:



2017年3月6日 星期一

英文單字學習機


     由於自己讀國小的小朋友有學習英文背單字的困擾,故用python開發了這個簡易的背英文單字程式,幫助小朋友練習單字。功能雖簡單卻都很實用,自從有了這個英文單字學習機後,我就再也不用盯著小朋友背單字了,頂多只需幫他們用excel建立好單字表。

目前建立的功能有:
1.可自行建立單字表,可利用excel編輯後,存成.csv檔。
2.測驗過程錯誤的單字,會重複提示,直到輸入正確才會進行下一個單字
3.測驗過程錯誤的所有單字會被記錄,可以按儲存功能,存成另一個.csv檔,下次可以直接開
    啟這個錯誤的單字檔在練習即可。
4.具有支援TTS 中文及英文發音,並在過程中會幫你加油打氣。
5.具有測驗拼字單字,單字撥放發音,及單字選擇題功能,期望達到聽、說、讀、寫方式記憶
   單字。
6.每範圍單字測驗結束後會自動按單字數量比例計分,成績優良,會語音給予讚美加油打氣
 ,讓使用者更有興趣動力繼續玩單字背單字。

安裝方式:

下載後不需安裝,只需將所有檔案放在同一資料夾,接著直接執行主程式Abu_words.exe即可

[2017/04/07]更新V1.01.00 ,增加中級及中高級單字表

免費下載連結:
https://drive.google.com/file/d/0BxWViAuJxH7gZl9tbEdDbkFfbms/view?usp=sharing

建議執行環境:Windows 10,使用windows 10才能獲得內建中文及英文發音支援(TTS),使用win7可能只有英語發音。
本程式絕無病毒及木馬請安心使用。

下載解壓縮後,第一次執行如果出現如下畫面,請點"其他資訊"然後選仍要執行