神經網絡理論基礎及 Python 實現

2021-02-20 Python開發者

(點擊上方藍字,快速關注我們)

來源:溫夢月 

www.jianshu.com/p/4824a45fc87d#

如有好文章投稿,請點擊 → 這裡了解詳情

一、多層前向神經網絡

多層前向神經網絡由三部分組成:輸出層、隱藏層、輸出層,每層由單元組成;

輸入層由訓練集的實例特徵向量傳入,經過連接結點的權重傳入下一層,前一層的輸出是下一層的輸入;隱藏層的個數是任意的,輸入層只有一層,輸出層也只有一層;

除去輸入層之外,隱藏層和輸出層的層數和為n,則該神經網絡稱為n層神經網絡,如下圖為2層的神經網絡;

一層中加權求和,根據非線性方程進行轉化輸出;理論上,如果有足夠多的隱藏層和足夠大的訓練集,可以模擬出任何方程;

二、設計神經網絡結構

使用神經網絡之前,必須要確定神經網絡的層數,以及每層單元的個數;

為了加速學習過程,特徵向量在傳入輸入層前,通常需要標準化到0和1之間;

離散型變量可以被編碼成每一個輸入單元對應一個特徵值可能賦的值

比如:特徵值A可能去三個值(a0,a1,a2),那麼可以使用3個輸入單元來代表A

如果A=a0,則代表a0的單元值取1,其餘取0;

如果A=a1,則代表a1的單元值取1,其餘取0;

如果A=a2,則代表a2的單元值取1,其餘取0;

神經網絡既解決分類(classification)問題,也可以解決回歸(regression)問題。對於分類問題,如果是兩類,則可以用一個輸出單元(0和1)分別表示兩類;如果多餘兩類,則每一個類別用一個輸出單元表示,所以輸出層的單元數量通常等一類別的數量。

沒有明確的規則來設計最佳個數的隱藏層,一般根據實驗測試誤差和準確率來改進實驗。

三、交叉驗證方法

如何計算準確率?最簡單的方法是通過一組訓練集和測試集,訓練集通過訓練得到模型,將測試集輸入模型得到測試結果,將測試結果和測試集的真實標籤進行比較,得到準確率。

在機器學習領域一個常用的方法是交叉驗證方法。一組數據不分成2份,可能分為10份,

第1次:第1份作為測試集,剩餘9份作為訓練集;

第2次:第2份作為測試集,剩餘9份作為訓練集;

……

這樣經過10次訓練,得到10組準確率,將這10組數據求平均值得到平均準確率的結果。這裡10是特例。一般意義上將數據分為k份,稱該算法為K-fold cross validation,即每一次選擇k份中的一份作為測試集,剩餘k-1份作為訓練集,重複k次,最終得到平均準確率,是一種比較科學準確的方法。

四、BP算法

通過迭代來處理訓練集中的實例;

對比經過神經網絡後預測值與真實值之間的差;

反方向(從輸出層=>隱藏層=>輸入層)來最小化誤差,來更新每個連接的權重;

4.1、算法詳細介紹

輸入:數據集、學習率、一個多層神經網絡構架;

輸出:一個訓練好的神經網絡;

初始化權重和偏向:隨機初始化在-1到1之間(或者其他),每個單元有一個偏向;對於每一個訓練實例X,執行以下步驟:

1、由輸入層向前傳送:

結合神經網絡示意圖進行分析:

由輸入層到隱藏層:

由隱藏層到輸出層:

兩個公式進行總結,可以得到:

Ij為當前層單元值,Oi為上一層的單元值,wij為兩層之間,連接兩個單元值的權重值,sitaj為每一層的偏向值。我們要對每一層的輸出進行非線性的轉換,示意圖如下:

當前層輸出為Ij,f為非線性轉化函數,又稱為激活函數,定義如下:

即每一層的輸出為:

這樣就可以通過輸入值正向得到每一層的輸出值。

2、根據誤差反向傳送 對於輸出層:其中Tk是真實值,Ok是預測值

對於隱藏層:

權重更新:其中l為學習率

偏向更新:

3、終止條件

偏重的更新低於某個閾值;

預測的錯誤率低於某個閾值;

達到預設一定的循環次數;

4、非線性轉化函數

上面提到的非線性轉化函數f,一般情況下可以用兩種函數:

(1)tanh(x)函數:

(2)邏輯函數,本文上面用的就是邏輯函數

五、BP神經網絡的python實現

需要先導入numpy模塊

import numpy as np

定義非線性轉化函數,由於還需要用到給函數的導數形式,因此一起定義

def tanh(x):

    return np.tanh(x)

def tanh_deriv(x):

    return 1.0 - np.tanh(x)*np.tanh(x)

def logistic(x):

    return 1/(1 + np.exp(-x))

def logistic_derivative(x):

    return logistic(x)*(1-logistic(x))

設計BP神經網絡的形式(幾層,每層多少單元個數),用到了面向對象,主要是選擇哪種非線性函數,以及初始化權重。layers是一個list,裡面包含每一層的單元個數。

class NeuralNetwork:

    def __init__(self, layers, activation='tanh'):

        """

        :param layers: A list containing the number of units in each layer.

        Should be at least two values

        :param activation: The activation function to be used. Can be

        "logistic" or "tanh"

        """

        if activation == 'logistic':

            self.activation = logistic

            self.activation_deriv = logistic_derivative

        elif activation == 'tanh':

            self.activation = tanh

            self.activation_deriv = tanh_deriv

 

        self.weights = []

        for i in range(1, len(layers) - 1):

            self.weights.append((2*np.random.random((layers[i - 1] + 1, layers[i] + 1))-1)*0.25)

            self.weights.append((2*np.random.random((layers[i] + 1, layers[i + 1]))-1)*0.25)

實現算法

    def fit(self, X, y, learning_rate=0.2, epochs=10000):

        X = np.atleast_2d(X)

        temp = np.ones([X.shape[0], X.shape[1]+1])

        temp[:, 0:-1] = X

        X = temp

        y = np.array(y)

 

        for k in range(epochs):

            i = np.random.randint(X.shape[0])

            a = [X[i]]

 

            for l in range(len(self.weights)):

                a.append(self.activation(np.dot(a[l], self.weights[l])))

            error = y[i] - a[-1]

            deltas = [error * self.activation_deriv(a[-1])]

 

            for l in range(len(a) - 2, 0, -1):

                deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))

            deltas.reverse()

 

            for i in range(len(self.weights)):

                layer = np.atleast_2d(a[i])

                delta = np.atleast_2d(deltas[i])

                self.weights[i] += learning_rate * layer.T.dot(delta)

實現預測

    def predict(self, x):

        x = np.array(x)

        temp = np.ones(x.shape[0]+1)

        temp[0:-1] = x

        a = temp

        for l in range(0, len(self.weights)):

            a = self.activation(np.dot(a, self.weights[l]))

        return a

我們給出一組數進行預測,我們上面的程序文件保存名稱為BP

from BP import NeuralNetwork

import numpy as np

 

nn = NeuralNetwork([2,2,1], 'tanh')

x = np.array([[0,0], [0,1], [1,0], [1,1]])

y = np.array([1,0,0,1])

nn.fit(x,y,0.1,10000)

for i in [[0,0], [0,1], [1,0], [1,1]]:

    print(i, nn.predict(i))

結果如下:

([0, 0], array([ 0.99738862]))

([0, 1], array([ 0.00091329]))

([1, 0], array([ 0.00086846]))

([1, 1], array([ 0.99751259]))

看完本文有收穫?請轉發分享給更多人

關注「大數據與機器學習文摘」,成為Top 1%

相關焦點

  • Python+Matlab+機器學習+深度神經網絡+理論+實踐+視頻+課件+源碼,附下載!
    資料包括三部分,第一部分是精心給數學基礎不太好的朋友準備的,畢竟要學好機器學習的理論,數學的基礎得過關,高數線代概率論起碼要知道點吧
  • Rust 能取代 Python,更好的實現神經網絡?
    Rust 也能實現神經網絡?
  • PyTorch搭建簡單神經網絡實現回歸和分類
    ,torchvision 是輔模塊,有資料庫,還有一些已經訓練好的神經網絡等著你直接用,比如 (VGG, AlexNet, ResNet)。也就是說只有把tensor置於Variable中,才能在神經網絡中實現反向傳遞、自動求導等運算。可以通過屬性 .data 來訪問原始的tensor,而關於這一Variable的梯度則可通過 .grad屬性查看。
  • 模糊控制理論,會從神經網絡手中拿到AI接力棒嗎?
    現在一提起人工智慧,我們首先想到的一定是神經網絡。神經網絡實踐應用的迅速發展,已經讓它成為了人工智慧中最當紅的技術。其實就在上世紀40年代相關的理論被提出後,神經網絡也經歷過幾十年跌宕起伏的發展,在50年代末進行了一次失敗的工程化實驗後,神經網絡的研究陷入低谷,還在研究它的學者曾一度被視為異端。
  • 【斯坦福CS224W】圖神經網絡理論,77頁ppt
    圖網絡(GNNs)的新變體層出不窮,但是卻鮮有對圖網絡框架的理論分析。Kipf在2017年提出的GCN中,曾從圖上的譜分析的角度給出了GCN的理論基礎;近期也有日本研究者從圖信號處理的角度,表明GNNs只是一個低頻濾波器(arxiv.org/abs/1905.09550)。
  • 深度學習背後的基礎-神經網絡揭秘
    最近, 深度學習三傑獲得了計算機界最重要的圖靈獎, 它們的貢獻都集中在對深度學習的根據神經網絡的理論突破。
  • 入門級神經網絡算法
    神經網絡可以指向兩種,一個是生物神經網絡,一個是人工神經網絡。生物神經網絡:一般指生物的大腦神經元,細胞,觸點等組成的網絡 ,用於產生生物的意識,幫助生物進行思考和行動。人工神經網絡(Artificial Neural Networks,簡寫為ANNs)也簡稱為神經網絡(NNs)或稱作連接模型(Connection Model),它是一種模仿動物神經網絡行為特徵,進行分布式並行信息處理的算法數學模型。這種網絡依靠系統的複雜程度,通過調整內部大量節點之間相互連接的關係,從而達到處理信息的目的。
  • 活在洗衣機裡的模糊控制理論,會從神經網絡手中拿到 AI 接力棒嗎?
    現在一提起人工智慧,我們首先想到的一定是神經網絡。神經網絡實踐應用的迅速發展,已經讓它成為了人工智慧中最當紅的技術。其實就在上世紀 40 年代相關的理論被提出後,神經網絡也經歷過幾十年跌宕起伏的發展,在 50 年代末進行了一次失敗的工程化實驗後,神經網絡的研究陷入低谷,還在研究它的學者曾一度被視為異端。
  • 神經網絡從0到1(五)——搭建神經網絡(上)
    這個是單獨的項目,所以大家可以跟著一步一步來完成並實現這個代碼。就是在y = x^2的基礎上增加了一些噪點,接下來我們開始搭建一個簡單的神經網絡。代碼如下:class Net(torch.nn.Module): def __init__(self, n_features, n_hidden, n_output): super().
  • 神經網絡算法
    雖然單個神經元的結構極其簡單,功能有限,但大量神經元構成的網絡系統所能實現的行為卻是極其豐富多彩的。神經網絡的研究內容相當廣泛,反映了多學科交叉技術領域的特點。主要的研究工作集中在以下幾個方面:(1)生物原型研究。從生理學、心理學、解剖學、腦科學、病理學等生物科學方面研究神經細胞、神經網絡、神經系統的生物原型結構及其功能機理。(2)建立理論模型。
  • 畫出漂亮的神經網絡圖!神經網絡可視化工具集錦搜集
    使用Caffe/draw.py6.Matlabhttp://www.mathworks.com/help/nnet/ref/view.html
  • 資源 | 用蘋果Core ML實現谷歌移動端神經網絡MobileNet
    蘋果軟體主管兼高級副總裁 Craig Federighi 在大會上介紹說,Core ML 致力於加速在 iPhone、iPad、Apple Watch 等行動裝置上的人工智慧任務,支持深度神經網絡、循環神經網絡、卷積神經網絡、支持向量機、樹集成、線性模型等。這一框架的易用性如何?大會之後,開源社區中很快就出現了有關 Core ML 的實現。
  • 使用Python+OpenCV實現神經網絡預處理人臉圖像的快速指南
    這通常意味著需要應用深度學習,因此在將圖像注入到我們的神經網絡之前需要一個特殊的預處理階段。為了提高我們的模型精度,這是一項非常重要的任務,通過以下幾個簡單的步驟可以很好地完成。對於本文,我們使用OpenCV:一個高度優化的計算機視覺開源庫,在C++、java和Python中都可用。這是一篇簡短的文章,包含了一些基本的指導原則、示例和代碼,你可以根據需求將它們應用到人臉分類或識別問題上。
  • 用Python實現BP神經網絡(附代碼)
    前兩期線性回歸及邏輯回歸項目已發布(見文末連結),今天來講講BP神經網絡。BP神經網絡全部代碼https://github.com/lawlite19/MachineLearning_Python/blob/master
  • 圖神經網絡概述
    簡述圖計算、圖資料庫、知識圖譜、圖神經網絡等圖技術領域的相關研究歷史,分類介紹不同類型的圖結構。分析對比不同的圖神經網絡技術,重點從頻域和空間與的信息聚合方式上分類比較不同的圖卷積網絡算法。闡述圖生成和圖對抗網絡、圖強化學習、圖遷移學習、神經任務圖和圖零樣本學習等不同的圖網絡與深度學習方法相結合的技術方法,並列舉不同的圖神經網絡技術在文本、圖像、知識圖譜、視頻任務等領域的具體應用。
  • Python深度學習之生成對抗神經網絡(GAN)簡介及實現
    GAN的主要靈感來源於博弈論中零和博弈的思想,應用到深度學習神經網絡上來說,就是通過生成網絡G(Generator)和判別網絡D(Discriminator)雙方的博弈學習,相互提高,最終達到一個平衡點,最終的均衡點為納什均衡點,此時生成器 G 生成的樣本非常逼真,使得鑑別器 D 真假難分。
  • 英特爾推出全新可便捷實現「更小更快更高效的神經網絡計算」的壓縮工具Distiller
    Distiller,便捷地實現了更小更快更高效的神經網絡計算。更小更快更節能目前的絕大多數神經網絡都越來越深,其參數達到了百萬量級。同時考慮到存儲和傳輸的限制,神經網絡的壓縮具有十分重要的現實需求。在精度可以接受的條件下,壓縮的越小神經網絡需要的計算資源和帶寬就越少。由於深度神經網絡的權重矩陣具有稀疏性,通過正則化和剪枝以及量化過程可以很好的壓縮模型的體量。稀疏的神經網絡模型表示可以被大幅度壓縮。
  • 基於憶耦器實現神經突觸可塑性和神經網絡模擬
    人腦是一個由約1011神經元和1015突觸構成的高度互連、大規模並行、結構可變的複雜網絡。在神經網絡中,神經元被認為是大腦的計算引擎,它並行地接受來自與樹突相連的數以千計的突觸的輸入信號。突觸可塑性即是通過特定模式的突觸活動產生突觸權重變化的生物過程,這個過程被認為是大腦學習和記憶的源頭。
  • 前沿 | 簡述脈衝神經網絡SNN:下一代神經網絡
    脈衝神經網絡(SNN)屬於第三代神經網絡模型,實現了更高級的生物神經模擬水平。
  • 手把手教你用OpenCV和Python實現圖像和視頻神經風格遷移(代碼)
    2015年,Gatsys等人在論文A Neural Algorithm of Artistic Style中提出了最初的神經風格遷移算法。2016年,Johnson等人發表了Perceptual Losses for Real-Time Style Transfer and Super-Resolutioin一文,將神經網絡遷移作為用感知損失處理超解析度問題的框架。