1. 程式人生 > >【機器學習筆記19】神經網路(單層感知機)

【機器學習筆記19】神經網路(單層感知機)

【參考資料】 【1】《人工神經網路教程》 【2】《matlab 2015b 神經網路技術》

基本概念

在這裡插入圖片描述

單層感知器可以看成一個線性累加器和一個二值化閾值元器件,通常會在累加一個偏移量。由公式表達為:oj=sgn(i=1nwijxi+b)o_j= sgn(\sum_{i=1}^n w_{ij}x_i+b) 其中 oj={1,sgn(i=1nwijxi+b)01,sgn(i=1nwijxi+b)<0 o_j = \begin{cases} 1, & sgn(\sum_{i=1}^n w_{ij}x_i+b) \ge 0 \\ -1, & sgn(\sum_{i=1}^n w_{ij}x_i+b) < 0 \end{cases}

實時上對於單層感知機而言,是根據輸入的x和o值,估計了引數w,而構築了一個i=1nwijxi+b=0\sum_{i=1}^n w_{ij}x_i+b = 0的超平面。 在這裡插入圖片描述

單層感知機的模型相當於是求解n元線性非齊次方程的逆過程,前者是已知閾值和輸出求x,後者是已經輸入x和輸出y估計引數。在估計的判斷機制裡,神經網路是期望有更多的輸入樣本符合判斷,而支援向量機則是讓超片面與各個樣本點有最遠的距離。

基本學習演算法

此步驟描述只考慮一個輸出

第一步 初始化

對於$w_{1j}$等所有權值賦予一個較小的隨機數

第二步 輸入訓練樣本

輸入訓練樣本$(x^p, d^p)$,前者為輸入,後者為期望輸出

第三步 計算實際輸出

計算實際輸出ojp=i=1nwijxp+bo_j^p=\sum_{i=1}^n w_{ij}x^p+b

第四步 根據實際輸出與期望輸出的差值調整引數

調整權值引數w1jt+1=w1jt+η(ojpdp)xpw_{1j}^{t+1} = w_{1j}^t + \eta(o_j^p-d^p)x^p,這裡$\eta$又稱為學習率

第四步

重複步驟2,直到所有的樣本(滿足要求數量)都符合期望的輸出

程式碼實踐
import numpy as np
from keras.models import Sequential
from keras.layers import Dense



def _test_signle_perceptron():

    x_train = np.array([[-1, 1, -2, 0],[-1, 0, 1.5, -0.5],[-1, -1, 1, 0.5]], dtype=float);

    y_train = np.array([[-1], [-1], [1]])

    """
    Sequential 序貫模型是多個網路層的線性堆疊
    """

    model = Sequential()

    """
    Dense 為常用的全連線層,主要引數:
        units:該層輸出的維度
        input_dim:輸入的維度
        activation:啟用函式
        use_bias:是否有偏移量
    """

    model.add(Dense(units=1, input_dim=4, activation='linear', use_bias=False))

    #設定一個初始化的權值
    model.set_weights([np.array([[0.5], [1], [-1], [0.]], dtype = float), np.array([0.], dtype=float)])


    """
    compile 為編譯整個模型
    loss 損失函式 mae 為mean_absolute_error
    optimizer 優化器 SGD 為梯度下降法
    metrics: 列表,顯示訓練時的一些效能指標

    """
    model.compile(loss='mae',
              optimizer='SGD',
              metrics=['accuracy'])

    """
    fit 為實際的訓練模型方法
    epochs 訓練的輪數
    batch_size 在做梯度下降時每次用到的樣本
    """
    model.fit(x_train, y_train,
          epochs=3,
          batch_size=3)

    print(model.get_weights())


"""
說明:

單層感知器線性模型,驗證《人工神經網路教程》例 3.2 

這個例子主要是梳理Keras模型的基礎函式,對神經網路訓練本身意義不大:)

作者:fredric

日期:2018-8-18

"""
if __name__ == "__main__":

    print("sigle perceptron test>>>>>>>>")

    _test_signle_perceptron()