溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

發(fā)布時(shí)間:2021-10-26 17:25:10 來(lái)源:億速云 閱讀:111 作者:柒染 欄目:編程語(yǔ)言

本篇文章給大家分享的是有關(guān)神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

一、多層前向神經(jīng)網(wǎng)絡(luò)

多層前向神經(jīng)網(wǎng)絡(luò)由三部分組成:輸出層、隱藏層、輸出層,每層由單元組成;

輸入層由訓(xùn)練集的實(shí)例特征向量傳入,經(jīng)過(guò)連接結(jié)點(diǎn)的權(quán)重傳入下一層,前一層的輸出是下一層的輸入;隱藏層的個(gè)數(shù)是任意的,輸入層只有一層,輸出層也只有一層;

除去輸入層之外,隱藏層和輸出層的層數(shù)和為n,則該神經(jīng)網(wǎng)絡(luò)稱為n層神經(jīng)網(wǎng)絡(luò),如下圖為2層的神經(jīng)網(wǎng)絡(luò);

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

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

二、設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)

使用神經(jīng)網(wǎng)絡(luò)之前,必須要確定神經(jīng)網(wǎng)絡(luò)的層數(shù),以及每層單元的個(gè)數(shù);

為了加速學(xué)習(xí)過(guò)程,特征向量在傳入輸入層前,通常需要標(biāo)準(zhǔn)化到0和1之間;

離散型變量可以被編碼成每一個(gè)輸入單元對(duì)應(yīng)一個(gè)特征值可能賦的值

比如:特征值A(chǔ)可能去三個(gè)值(a0,a1,a2),那么可以使用3個(gè)輸入單元來(lái)代表A

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

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

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

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

神經(jīng)網(wǎng)絡(luò)既解決分類(classification)問(wèn)題,也可以解決回歸(regression)問(wèn)題。對(duì)于分類問(wèn)題,如果是兩類,則可以用一個(gè)輸出單元(0和1)分別表示兩類;如果多余兩類,則每一個(gè)類別用一個(gè)輸出單元表示,所以輸出層的單元數(shù)量通常等一類別的數(shù)量。

沒(méi)有明確的規(guī)則來(lái)設(shè)計(jì)***個(gè)數(shù)的隱藏層,一般根據(jù)實(shí)驗(yàn)測(cè)試誤差和準(zhǔn)確率來(lái)改進(jìn)實(shí)驗(yàn)。

三、交叉驗(yàn)證方法

如何計(jì)算準(zhǔn)確率?最簡(jiǎn)單的方法是通過(guò)一組訓(xùn)練集和測(cè)試集,訓(xùn)練集通過(guò)訓(xùn)練得到模型,將測(cè)試集輸入模型得到測(cè)試結(jié)果,將測(cè)試結(jié)果和測(cè)試集的真實(shí)標(biāo)簽進(jìn)行比較,得到準(zhǔn)確率。

在機(jī)器學(xué)習(xí)領(lǐng)域一個(gè)常用的方法是交叉驗(yàn)證方法。一組數(shù)據(jù)不分成2份,可能分為10份,

  • 第1次:第1份作為測(cè)試集,剩余9份作為訓(xùn)練集;

  • 第2次:第2份作為測(cè)試集,剩余9份作為訓(xùn)練集;

  • ……

這樣經(jīng)過(guò)10次訓(xùn)練,得到10組準(zhǔn)確率,將這10組數(shù)據(jù)求平均值得到平均準(zhǔn)確率的結(jié)果。這里10是特例。一般意義上將數(shù)據(jù)分為k份,稱該算法為K-fold  cross validation,即每一次選擇k份中的一份作為測(cè)試集,剩余k-1份作為訓(xùn)練集,重復(fù)k次,最終得到平均準(zhǔn)確率,是一種比較科學(xué)準(zhǔn)確的方法。

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

四、BP算法

通過(guò)迭代來(lái)處理訓(xùn)練集中的實(shí)例;

對(duì)比經(jīng)過(guò)神經(jīng)網(wǎng)絡(luò)后預(yù)測(cè)值與真實(shí)值之間的差;

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

4.1、算法詳細(xì)介紹

輸入:數(shù)據(jù)集、學(xué)習(xí)率、一個(gè)多層神經(jīng)網(wǎng)絡(luò)構(gòu)架;

輸出:一個(gè)訓(xùn)練好的神經(jīng)網(wǎng)絡(luò);

初始化權(quán)重和偏向:隨機(jī)初始化在-1到1之間(或者其他),每個(gè)單元有一個(gè)偏向;對(duì)于每一個(gè)訓(xùn)練實(shí)例X,執(zhí)行以下步驟:

1、由輸入層向前傳送:

結(jié)合神經(jīng)網(wǎng)絡(luò)示意圖進(jìn)行分析:

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

由輸入層到隱藏層:

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

由隱藏層到輸出層:

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

兩個(gè)公式進(jìn)行總結(jié),可以得到:

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

Ij為當(dāng)前層單元值,Oi為上一層的單元值,wij為兩層之間,連接兩個(gè)單元值的權(quán)重值,sitaj為每一層的偏向值。我們要對(duì)每一層的輸出進(jìn)行非線性的轉(zhuǎn)換,示意圖如下:

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

當(dāng)前層輸出為Ij,f為非線性轉(zhuǎn)化函數(shù),又稱為激活函數(shù),定義如下:

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

即每一層的輸出為:

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

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

2、根據(jù)誤差反向傳送 對(duì)于輸出層:其中Tk是真實(shí)值,Ok是預(yù)測(cè)值

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

對(duì)于隱藏層:

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

權(quán)重更新:其中l(wèi)為學(xué)習(xí)率

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

偏向更新:

神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的

3、終止條件

偏重的更新低于某個(gè)閾值;

預(yù)測(cè)的錯(cuò)誤率低于某個(gè)閾值;

達(dá)到預(yù)設(shè)一定的循環(huán)次數(shù);

4、非線性轉(zhuǎn)化函數(shù)

上面提到的非線性轉(zhuǎn)化函數(shù)f,一般情況下可以用兩種函數(shù):

(1)tanh(x)函數(shù):

  • tanh(x)=sinh(x)/cosh(x)

  • sinh(x)=(exp(x)-exp(-x))/2

  • cosh(x)=(exp(x)+exp(-x))/2

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

五、BP神經(jīng)網(wǎng)絡(luò)的python實(shí)現(xiàn)

需要先導(dǎo)入numpy模塊

import numpy as np

定義非線性轉(zhuǎn)化函數(shù),由于還需要用到給函數(shù)的導(dǎo)數(shù)形式,因此一起定義

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))

設(shè)計(jì)BP神經(jīng)網(wǎng)絡(luò)的形式(幾層,每層多少單元個(gè)數(shù)),用到了面向?qū)ο?,主要是選擇哪種非線性函數(shù),以及初始化權(quán)重。layers是一個(gè)list,里面包含每一層的單元個(gè)數(shù)。

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)

實(shí)現(xiàn)算法

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)

實(shí)現(xiàn)預(yù)測(cè)

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

我們給出一組數(shù)進(jìn)行預(yù)測(cè),我們上面的程序文件保存名稱為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))

結(jié)果如下:

([0, 0], array([ 0.99738862])) ([0, 1], array([ 0.00091329]))  ([1, 0], array([ 0.00086846]))  ([1, 1], array([ 0.99751259]))

以上就是神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)是怎么樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI