顯示具有 人工神經網路 標籤的文章。 顯示所有文章
顯示具有 人工神經網路 標籤的文章。 顯示所有文章

2018年3月25日 星期日

深度學習(7)--使用Tensorflow實現類VGG model 訓練Cifar10數據集


    繼上一篇我們使用Alexnet 模型來訓練Cifar10數據集,這次我們改用VGG16 模型來做訓練及預測。Cifar10的數據集可以從以下網址下載:
https://www.cs.toronto.edu/~kriz/cifar.html

     從本質上來看,VGGNet 是在更細的粒度上實現的AlexNet,他廣泛的使用非常小的卷積核架構去實現更深層次的卷積網路神經網路。在一定的程度上證實了,增加卷積神經網路的深度,增加更多的隱藏層和權重可以實現對識別的明顯改進。

    從VGGNet的結構上來說,與AlexNet並沒有太大的區別,只不過增加了更多隱藏層,VGG的參數較多調整範圍大,而最終生成的模型參數是AlexNet的3倍左右,VGGNet的模型圖如下圖所示:


<picture 1> VGGNet的模型圖 , citation: htpps://arxiv.org/pdf/1409.1556.pdf


2017年5月20日 星期六

深度學習(4)--使用Tensorflow實現類Lenet5手寫數字辨識


    這一節介紹一完整的手寫數字辨識的範例,使用Tensorflow來實現類似Lenet5的架構。除了使用MNIST數據集來做訓練與測試外,我們將訓練好的模型儲存起來,並用微軟小畫家自行手寫幾張數字來進行實際的辨識預測,最後使用Kaggle網站上的手寫數字數據進行預測,並將結果上傳至kaggle網站上打分數,得到預測的成績。

   本文主要提供程式實作,不會再提到太多相關的理論,有關相關的理論,大多可以在最底下之前提過的文章或參考資料閱讀相關理論。這個程式的建立環境是python 3.5 +tensorflow1.10 win10底下使用GPU加速運算,估計跑在Linux或是純CPU運算應該也沒太大問題。


首先來回顧Lenet5的經典架構,如下<圖一>
Lenet5模型是Yann LeCun教授於1998年在論文Gradient-based learning applied to document recognition中提出的,它是第一個成功應用於數字識別問題的卷積神經網路。在MNIST數據集上,Lenet5模型可以達到大約99.2%的正確率,Lenet5模型總共有7層。

有關CNN卷積神經網路的介紹可參閱之前文章:
深度學習(2)--使用Tensorflow實作卷積神經網路(Convolutional neural network,CNN)

<圖一>Lenet5架構


第一層 卷積層(Convolution)
    這一層的輸入就是原始圖像像素,Lenet5接受的輸入層大小為32x32x1。第一個卷積層filter的尺寸為5x5,深度為6,不使用zero padding,步長(Stride)為1,故這一層輸出的尺寸為32-5+1=28,深度為6。總共有5x5x1x6+6=156個參數,其中6為bias偏誤。因下一層節點矩陣有28x28x6=4704個節點,每個節點和5x5=25個節點相連,所以本層卷積層總共有4707x(25+1)=122304個連接。

第二層 池化層(Pooling)
    這一層的輸入為第一層的輸出,是一28x28x6的節點矩陣,本層採用的filter為2x2,stride=2,故輸出矩陣大小為14x14x6。

第三層 卷積層(Convolution)
    本層的輸入矩陣大小為14x14x6,使用的filter為5x5,深度為16,不使用Zero padding,stride=1,本層的輸出矩陣大小為10x10x6。因此本層應該有5x5x6x16+16=2416個參數,
10x10x16x(25+1)=41600個連接。

第四層 池化層(Pooling)
    本層的輸入矩陣大小為10x10x16,採用filter為2x2,stride為2,本層的輸出矩陣大小為5x5x16。

第五層 卷積層(Convolution)
    本層的輸入矩陣大小為5x5x16,在Lenet5模型的論文終將這一層稱為卷積層,但是因為filter大小即為5x5,所以和全連接層沒有區別,如果將5x5x16節點拉成一個向量,那麼這一層就和全連接層一樣,本層的輸出節點數為120,總共有5x5x16x120+120=48120個參數。

第六層 全連接層
    本層的輸入節點數為120個,輸出節點數為84個,參數總共為120x84+84=10164個。

第七層 全連接層
    本層的輸入節點數為84個,輸出節點為10個,參數總共為84x10+10=850個。

底下會使用Tensorflow來實現類似Lenet5的架構如下<圖二>
在卷積層因為使用了Zero padding所以,圖像尺寸不會縮小
在程式裡是以padding='SAME'來宣告。
conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')

<圖二>

2017年5月7日 星期日

深度學習(3)--循環神經網絡(RNN, Recurrent Neural Networks)


    本節介紹最簡單的循環神經網路,稱之為Simple-RNN,它是LSTM的基礎。Simple-RNN與BP一樣都有前饋層與反饋層。但是Simple-RNN引入了基於時間(狀態)的循環機制。

    下圖一所示為Simple-RNN的神經網路示意圖。神經網路為A,通過讀取某個時間(狀態)的
輸入xt,然後輸出一個值ht,循環可以使得信息從當前時間步傳遞到下一時間步。
    這些循環使得RNN可以被看作同一網路在不同時間步的多次循環,每個神經元會把更新的結果傳遞給下一個時間步,下圖一右側即為循環展開的情形。


<圖一>


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年2月25日 星期六

機器學習(7)--利用核主成分分析(Kernel PCA)處理非線性對應


    在這之前所探討的輸入數據都是假設為可線性分離的,如果輸入數據不是線性可分離的,實務上的數據往往是這樣,那麼標準PCA,所設計的線性轉換技術就不是最好的選擇,在本節介紹核PCA(kernel PCA),它與核支援向量機(kernel SVM)類似,利用核技巧來將非線性分離的數據轉換到一個新的特徵子空間,而轉換之後便可以做線性分離。


核函數與核技巧:

    類似核SVM的作法,透過核函數與核技巧,將原始數據投影到更高維的新特徵空間,而在新特徵空間,數據類別是可以線性分離的。要轉換d維空間的樣本到更高維的k維空間,我們需要定義一個非線性對應函數Φ:
    如下方式,原本數據X有兩個特徵行向量,為2維d=2。利用函數Φ可以對應到3維空間k=3。
       

    整體上來說就是,透過核PCA,我們執行一個非線性對應函數將數據轉換到一個更高維的空間,並在這個高維的空間,使用標準PCA,再將數據投影回到一個較低維度的子空間,在這個低維度的子空間中,樣本即可使用線性分類器來分離。
    這個方法的缺點是非常耗費計算資源,因此我們可以使用核技巧,使用核技巧,我們可以計算兩個由原始的特徵空間所產生的高維特徵向量之間的相似度。
    套用之前標準PCA的推導(此略),我們可以定義一核矩陣(相似度矩陣)K:
核函數k則可以替代原本需使用的非線性對應函數Φ:
    這樣我們就不用去計算原本需由非線性對應函數Φ去處理的樣本中兩兩數據點的內積(公式右側),因此核函數也可以理解為,一個計算兩個向量內積的函數,也就是計算相似度的函數。而不像標準PCA,會建立一個轉換矩陣,經過核PCA處理之後,所得到的是已經投影完成的樣本。
 
    在此我們使用的核函數為RBF(Radial Basis Function Kernel):
實作一個「RBF核」(Radial Basis Function Kernel)PCA,我們可以定義如下的三個步驟:



2017年2月23日 星期四

機器學習(6)--主成分分析(Principal component analysis,PCA)



    這一篇介紹主成分分析(Principal component analysis,PCA),是一種特徵提取的技術,利用特徵降維來避免因維度災難所造成的過度適合(Overfitting)現象。就是說假如訓練資料集裡有很多個特徵數據,我們可以利用主成分分析(Principal component analysis,PCA)來選取最有影響的幾個特徵來做分類器模型的訓練而不需要使用所有的特徵數據來做訓練。
    在這個範例裡,我們將使用葡萄酒數據集來做示範,把原本有的13個特徵,利用PCA分析後只找出兩個主要的特徵值作為分類器模型分類的特徵依據。

    PCA著眼在高維度的數據,"最大化變異數"並投影到與原數據及相同維數或較低維數的"新特徵子空間"。新特徵子空間的正交軸即是"主成分"。

<圖一>x1,x2軸維原本的,PC1,PC2為主成分




2017年2月18日 星期六

機器學習(5)--邏輯斯迴歸,過度適合與正規化( Logistic regression,overfitting and regularization)


  本節介紹邏輯斯迴歸模型(Logistic regression)過度適合(overfitting)正規化(regularization)。邏輯斯迴歸模型(Logistic regression)能處裡線性和二元分類的問題,要注意的是這裡所要說的邏輯斯迴歸模型(Logistic regression)是分類模型而無關於"迴歸"。

邏輯斯迴歸模型(Logistic regression):

首先來看一下邏輯斯迴歸模型(Logistic regression),如下圖跟前一章所介紹的
適應線性神經元模型類似,但是其所使用的啟動函數不同,成本函數也不同。

<圖一>邏輯斯迴歸模型(Logistic regression)


2017年2月15日 星期三

機器學習(4)--資料標準常態化與隨機梯度下降法( standardization & Stochastic Gradient descent)


    這篇承接上一篇適應線性神經元與梯度下降法,講述隨機梯度下降法(Stochastic Gradient descent,簡稱SGD)與資料標準常態化(standardization)
    有關適應線性神經元與梯度下降法可先閱讀底下連結:
機器學習(3)--適應線性神經元與梯度下降法(Adaline neuron and Gradient descent)

首先資料標準常態化(standardization)是一種特徵縮放方法,標準化後,特徵值會滿足標準常態分佈,並且每個平均值都是0,標準差都是1。例如,若要標準化樣本x第j個特徵,只要將樣本減去平均值μ,再除以標準差σ,就完成了,計算方式如下:

可以簡單的使用Numpy的mean與std方法便可快速,簡單的完成標準化工作,程式如下:
X_std[:, 0] = (X[:, 0] - X[:, 0].mean()) / X[:, 0].std()
X_std[:, 1] = (X[:, 1] - X[:, 1].mean()) / X[:, 1].std()
print("標準化特徵值0:X_std[:, 0]",X_std[:, 0] )
print("標準化特徵值1:X_std[:, 1]",X_std[:, 1] )

結果如下圖一:特徵值0及特徵值1分別是上一篇所使用鳶尾花的花萼長及花瓣長。原本的資料單位為公分,可以看出原始資料比1.0或0.0大很多,而標準化後的資料皆在正負0~2之間,以直觀的數學來說這會比原本的資料容易做訓練及運算。因此資料在做過標準常態化的特徵縮放後可以獲得較佳的效能。

<圖一>未標準化與標準化後的資料


下圖二是使用上一節適應線性神經元與梯度下降法做資料標準化後的收斂速度比較,在上半
圖為標準化後的資料,學習速率設定為0.01在15輪的迭代後,成本即收斂至最佳化,而在下
圖為資料未標準化,學習速率設定為0.0001,需要150輪迭代後,成本才收斂至最佳化,為
何學習速率設定不也設定在0.01呢?因這個例子來講當資料未標準化,將學習速率設定為0.01,會發現成本函數無法收斂至最佳化也就是上一節所說的,當學習速率過大時會衝過全域最小值而無法收斂。故資料標準化後配合適當的學習速率便可得到好的訓練效能。


<圖二>未標準化與標準化後訓練資料收斂的速度比較




2017年2月14日 星期二

機器學習(3)--適應線性神經元與梯度下降法(Adaline neuron and Gradient descent)

        這一節要介紹另一種類型的單層神經網路:適應線性神經元(Adaline)。並以梯度下降法
(Gradient descent)最小化成本函數。適應線性神經元(Adaline)在實務上是非常吸引人的,因為它清楚的說明了如何定義"成本函數",以及如何最小化"成本函數"的觀念,奠定了機器學習的理論基礎。在本文中主要還要介紹幾個機器學習或是深度學習裡都會出現的名詞,包括梯度下降法(Gradient descent)批次(batch)學習速率啟動函數(activation function)、以及偏誤(bias),在文末會以Python實作適應線性神經元(Adaline)。


     適應線性神經元(Adaline)可以算是Rosenblatt感知器改進方法,Adaline規則(也稱Widrow-Hoff規則)與Rosenblatt感知器之間最主要的差異在於,權重更新是基於"線性啟動函數"(Linear activation function),不像感知器是使用"單位階梯函數"(unit step function),在Adaline規則中它的線性啟動函數Φ(z)就是淨輸入,因此
並使用單位階梯函數量化器(quantizer)來預測類別標籤。可看以下圖示:
比較下圖差異,Adaline使用連續值的線性啟動函數來計算誤差及更新權重,而不是用它來預測二元類別標籤。

<圖一>適應線性神經元(Adaline)


2017年2月10日 星期五

演算法(2)--使用Numpy.bincount來實作簡單的桶子排序法



        會注意到Numpy.bincount()這個函數,其實是在閱讀機器學習的程式碼裡常常出現。常用來
處理類別標籤的向量。它是內建在Python Numpy裡。原文的解釋其實有點難懂,故我把我的心得
記下來,發現它原始設計的概念就是類似桶子排序法的基本概念,是一個很有趣的函數,所以也
特別用它實作一簡單的桶子排序。

理解Numpy.bincount()
numpy.bincount(x, weights=None, minlength=None)

 1.假設輸入X=[0,1,2,2,3,4,4],那麼產生bins(桶子)的數量為該X最大值4
 再加1=5,於是我們產生了5個bins(桶子)的排序編號為indx0~indx4,
 可以視為一向量[indx0,indx1,indx2,indx3,indx4]

 2.接著來看如何放原本的資料到這5的桶子(bins,分別indx0~indx4)
 原本的輸入X=[0,1,2,2,3,4,4]裡有"一個"資料0,表示要放到indx0桶子的只有一個
 故indx0=1。
 接著,原本的輸入X=[0,1,2,2,3,4,4]裡有"一個"資料,表示要放到indx1桶子的只有
 一個,故indx1=1。
 接著,原本的輸入X=[0,1,2,2,3,4,4]裡有"兩個"資料,表示要放到indx2桶子的有
 兩個,故indx1=2。
    依序放完所以桶子,indx3及 indx4桶子,可以得到indx3=1,indx4=2
    故得到輸出結果為[1,1,2,1,2]即:[indx0=1,indx1=1,indx2=2,indx3=1,indx4=2]
 使用Python語言程式如下:
   EX1:
 import numpy as np
 X=[0,1,2,2,3,4,4]
 print(np.bincount(X))
   結果是:[1,1,2,1,2]

  EX2:
   import numpy as np
 X=[0,5,3,2,3,1,4,2,4]
 print(np.bincount(X))
 結果是:[1,1,2,2,2,1]

  注意:輸入的X數值不可以為負,否則報錯
 若有實數值,實際測試會被無條件捨去後當整數使用




2017年1月7日 星期六

深度學習(1)-如何在windows安裝Theano +Keras +Tensorflow並使用GPU加速訓練神經網路


本篇文章介紹如何安裝Theano 及Keras, Tensorflow深度學習的框架在windows環境上,並快速的使用Keras的內建範例來執行人工神經網路的訓練。

     之前也有實作Tensorflow 及caffe在VM+ubuntu16.04環境安裝的經驗,甚至安裝在NVIDIA的Jetson TX1 的慘痛經驗XD(雖然後來也是有安裝成功)。各深度學習的框架各有它的優缺點,有許多文章已做過類似的分析,在此我不會對這部分著墨太多,只會敘述自己之前安裝的一些經驗來提供大家參考,特別如果是要在windows環境上使用,並且具有NVIDIA CUDA支援GPU加速運算的功能。
      雖然也很多人認為應該直接使用Linux環境會比較適合做深度學習框架的使用及學習,原因是使用Linux的人或網路資源比較多,而且Linux對於電腦硬體效能有優化。但對於Linux環境不熟的人,使用windows環境仍然有它方便性存在,而對於Python程式語言來說,其程式碼在Linux環境或windows環境做切換是很容易的,當然Theano ,Keras,Tensorflow也可以安裝在Linux環境上使用。接下來開始正式介紹如何在一般常見的筆電上建構這個環境,在一般的筆電上也可以使用GPU加速訓練人工神經網路的快感。


<圖一>為Keras 的lstm_benchmark.py 範例輸出結果




2016年11月22日 星期二

Conway's Game of Life in Python(使用Python實現Conway的生命遊戲)

    這篇文章提供一Python範例程式來實現Conway的生命遊戲,並使用Pygame套件實現出動畫效果。

在1970年,英國數學家約翰·康威(John Conway)創造了他的“生命遊戲”。
這是一組規則,在一殖民地裡模仿生物有機體的混亂和生長及死亡。
在“遊戲”裡由“活的”和“死的”細胞單元組成,並將演變呈現在網格上。
從這一代過到下一代的規則如下:
     在網格上以該細胞為中心計算其八個相鄰的細胞,

1.假設人口過剩:如果該"活細胞"被三個以上的活細胞包圍,它就會死亡。
2.停滯:如果活細胞被兩個或三個活細胞包圍,它可以繼續存活。
3.如果人口過少:如果活細胞被少於兩個活細胞包圍,它也會死亡。
4.繁殖:如果死細胞被正好三個細胞包圍,它將變成活細胞。

    在程式裡我們設定0為死細胞,1為活細胞,利用Numpy及Pygame做成演變動畫
透過一直循環執行這些規則,可以出現美麗和意想不到的圖案,
有些已死的區域或是長時間不再變化的區域,經由更長的時間演變
因外來的細胞將再重新活耀起來。這遊戲迷人的地方在於它不完全是
由隨機亂數產生,他有上述的幾個規則存在,但是結果又是那麼不可預期,
好像是真的生命細胞在自己演化一般,然而實質上這只是一段程式代碼。


<圖一>隨機產生的細胞自由演化



2016年11月17日 星期四

OPENCV(10)--Canny Edge Detection(Canny邊緣檢測)


    這篇介紹Canny 邊緣檢測原理,即OPENCV提供的Canny演篹法函式庫並實作一範例程式
可用兩個Trackbar 去調整minVal(T1) ,maxVal(T2)閥值,可以清楚看出minVal ,maxVal閥值對Canny 邊緣的變化影響。




原理:
    Canny  邊緣檢測是一種非常流行的邊緣檢測演算法,是 John  F.Canny 在
1986  年提出的。它是一個有很多步驟形成的演算法,我們接下來逐步介紹。

Canny邊緣檢測演算法步驟:

Step 1.雜訊去除
由於邊緣檢測很容易受到雜訊影響,所以第一步是使用 5x5 的高斯濾波器 去除雜訊。

Step 2.計算圖像梯度
    對平滑後的圖像使用 Sobel 運算元計算水平方向和垂直方向的一階導數(Gx  和 Gy),
根據得到的這兩幅梯度圖(Gx  和 Gy)找到邊界的梯度和方向,公式如下:


2016年11月16日 星期三

OPENCV(9)--Image Gradients(圖像梯度)



這篇文章介紹Image Gradients(圖像梯度),Gradient(梯度)簡單來說就是求導數(微分)。
利用Gradient(梯度)可以找出圖像邊界,通常會將圖像先灰值化,而邊界就存在像素變化差異大的地方。
    例如:鄰近連續的黑像素(0)與白像素(255)之間必然存在一邊界,鄰近像素值差異越大,存在的邊界越明顯。可以把鄰近連續的像素值變化看作一函數,而利用Gradient(梯度)便可查知其形成的可能邊界。


Sobel 運算元和 Scharr 運算元

        Sobel,Scharr 可求一階或二階導數。
        Scharr 其實是Sobel在kernel 核心3X3時的優化。
        Sobel 運算元是高斯平滑與微分操作的結合體,所以它的抗雜訊能力很好。
        你可以設定求導的方向,x方向或y方向(即對X或Y作偏微分)。也可以設定使用的卷積核的大小ksize)。
        如果 ksize=-1,會使用 3x3 的 Scharr 濾波器,它的的效果要 比 3x3 的 Sobel 濾波器好
        3x3 的 Scharr 濾波器卷積核如下:

Sobel 濾波器卷積核如下:



Laplacian 運算元

         Laplacian 是求二階導數,其找出邊界效果佳,但是對於抗雜訊能力不佳。
可假設其離散實現類似於二階Sobel 導數,事實上,OpenCV 在計算拉普拉斯運算元時直接調用Sobel 算子。計算公式如下:


拉普拉斯濾波器使用的卷積核:

OpenCV 提供了這種不同的梯度濾波器,或者說高通濾波器。Sobel,Scharr 和 Laplacian。
使用到的函數為:cv2.Sobel(),cv2.Schar(),cv2.Laplacian()        
下圖為其程式範例結果:

<圖一>Sobel ,Scharr ,Laplacian 


2016年11月6日 星期日

OPENCV(7)--2D Convolution ,Image Filtering and Blurring (旋積,濾波與模糊)


        這篇介紹OPENCV提供的對影像作空間濾波的工具,透過2D Convolution(旋積或譯卷積),可以達到對影像作濾波的功能,而對影像實施低通濾波(LPF),實質上就是對影像作去除雜訊,模糊化的作用,而高通濾波(HPF)實質上對影像的作用就是銳利化,以及可以凸顯出影像的邊緣。

2D Convolution 

        跟信號一樣我們也可以對 2D 圖像實施低通濾(LPF)高通濾波(HPF)等。OpenCV 提供的函數 cv.ftlter2D() 可以讓我們對一幅圖像進行卷積操作。
如下圖<一>我們對一幅圖像Convolution (旋積),底下是使用一個 3x3 kernel (核)的運算範例圖。

        操作如下:將核放在原圖像的一個像素A 上,求與核對應的圖像上 3x3個像素的和,用這個值替代像素 A 的值。重複以上操作直到 將圖像的每一個像素值都更新一遍。

圖<一>2D Convolution演算法

此圖來源:



人工神經網路(2)--使用Python實作後向傳遞神經網路演算法(Backprogation artificial neature network)

     這篇文章介紹後向傳遞神經網路演算法(Backprogation artificial neature network),並使用Python語言實作實現一XOR邏輯功能的多層網路模型。
     在底下前一篇文章單一神經元感知器的實作上知道,單一感知器無法實作出具XOR邏輯運算的功能,在這篇會改用多層網路模型並使用後向傳遞神經網路演算法(Backprogation artificial neature network)來實現XOR的邏輯功能。

人工神經網路(1)--使用Python實作perceptron(感知器)


多層神經網路:

          多層感知器是有一個或是多個隱含層的神經網路,通常網路包含一個來源神經元的輸入層,至少包含一個計算元的隱含層,以及一個計算神經元的輸出層,輸入號信一層一層的向前傳遞,這動作也稱之為前饋式傳遞神經網路,其模型如下圖<一>所示
          多層神經網路,各層多有其特定的功能,輸入層為接受外部的輸入信號,輸出層從隱含層接受輸出信號,為整個網路建立輸出形樣類別。
          隱含層的神經元發現特徵,其權重表示了其輸入型樣中的特徵,輸出層再根據這些特徵確定輸出型樣。
          利用一個隱含層,可以表示輸入信號的任何連續ˋ函數,利用兩個隱含層甚至可以表示不連續的函數,換言之,多個隱含層也可以解決單一感知器只能做單一線性分割的問題。


<圖一>有兩個隱含層的多層感知器神經網路



多層神經網路如何學習?

           最常用的是後向傳遞神經網路演算法,在1969年被首次提出(Bryson和Ho),但是由於對計算要求過於嚴苛而被忽略,直到20世紀80年代這種演算法才又被重新重視。
          多層網路的學習過程與感知器類似,提供輸入信號經過權重調節加總,計算出實際輸出,跟期望輸出比較算出誤差,再藉由調整權重來減小收斂誤差。
         在感知器中,每個輸入Xi僅有一個相對應的權重Wi和一個輸出Y,但在多層神經網路中,每一個權重對每一個輸出都有貢獻,而每一個輸入信號Xi,連接到各隱含層的神經元都有相對應的權重Wij,每個隱含層輸出也會有相對應的Wjk連結到每個輸出Yk,如下<圖二>所示:
         其中i為輸入層第i個輸入,j表示隱含層第j個神經元感知器,k為輸出層第k個輸出。
在後向傳遞網路中,學習演算法過程分為兩個階段,第一階段與感知器前饋式演算雷同,信號由輸入端向隱含層一層一層傳遞直到輸出層,如果實際輸出與預期的輸出不同,則計算其誤差,而第二階段則是將此誤差反向從輸出端經過隱含層再傳遞回輸入層,在這過程則同時調整其權重Wjk和Wij。反覆這樣的動作直到誤差收斂到一定的滿足條件值。


<圖二>三層後向傳遞網路

2016年11月5日 星期六

人工神經網路(1)--使用Python實作perceptron(感知器)



        這篇文章介紹人工神經網路最基本的單元,perceptron(感知器)。使用最簡化的數學公式
說明,並利用Python語言實作單一感知器and 及or 的邏輯功能.

        1943年,Warren McCulloch 和Walter Pitts 提出了一簡單計算元素的神經元,這個思想現在仍然是大多數人工神經網路的基礎.
        如下<圖一>神經元接收了來自輸入連結的一些輸入信號(X1......Xn),這些輸入信號可以是原始資料或是其他神經元的輸出信號。輸出信號則可以是最終答案,也可以是其他神經元的輸入信號。
        神經元計算帶權重輸入信號和並將結果和臨界值θ比較,如果網路淨輸入比臨界值低,則神經元輸出0,反之,如果網路淨輸入比臨界值低,則神經元輸出1。

<圖一>典型的神經元




        換言之,神經元使用下面的轉移或激勵函數.
其中X是神經元的淨權重輸入,Xi 是"輸入i"的值,Wi是"輸入i"的權重,
n是神經元輸入數量,Y是神經元的輸出。