最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年12月15日 14:50:19   作者:溫夢月  
這篇文章主要介紹了神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)詳解,具有一定借鑒價值,需要的朋友可以參考下。

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

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

輸入層由訓(xùn)練集的實(shí)例特征向量傳入,經(jīng)過連接結(jié)點(diǎn)的權(quán)重傳入下一層,前一層的輸出是下一層的輸入;隱藏層的個數(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)練集,可以模擬出任何方程;

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

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

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

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

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

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

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

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

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

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

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

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

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

四、BP算法

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

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

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

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

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

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

1、由輸入層向前傳送:

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

由輸入層到隱藏層:

由隱藏層到輸出層:

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

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

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

即每一層的輸出為:

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

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

對于隱藏層:

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

偏向更新:

3、終止條件

偏重的更新低于某個閾值;
預(yù)測的錯誤率低于某個閾值;
達(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è)計BP神經(jīng)網(wǎng)絡(luò)的形式(幾層,每層多少單元個數(shù)),用到了面向?qū)ο?,主要是選擇哪種非線性函數(shù),以及初始化權(quán)重。layers是一個list,里面包含每一層的單元個數(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ù)測

  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ù)測,我們上面的程序文件保存名稱為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]))

總結(jié)

以上就是本文關(guān)于神經(jīng)網(wǎng)絡(luò)理論基礎(chǔ)及Python實(shí)現(xiàn)詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

淺談機(jī)器學(xué)習(xí)需要的了解的十大算法

python實(shí)現(xiàn)協(xié)同過濾推薦算法完整代碼示例

python實(shí)現(xiàn)機(jī)械分詞之逆向最大匹配算法代碼示例

如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • 使用Python實(shí)現(xiàn)視頻封面批量下載器

    使用Python實(shí)現(xiàn)視頻封面批量下載器

    在視頻網(wǎng)站上,每個視頻都有一個獨(dú)特的封面圖像,本文主要為大家詳細(xì)如何使用Python編寫一個視頻封面批量下載器,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • python 基于opencv實(shí)現(xiàn)高斯平滑

    python 基于opencv實(shí)現(xiàn)高斯平滑

    這篇文章主要介紹了python 基于opencv實(shí)現(xiàn)高斯平滑,幫助大家更好的理解和使用python處理圖片,感興趣的朋友可以了解下
    2020-12-12
  • 使用Python?Matplotlib處理地理數(shù)據(jù)可視化

    使用Python?Matplotlib處理地理數(shù)據(jù)可視化

    地理數(shù)據(jù)可視化是數(shù)據(jù)科學(xué)中一個重要的領(lǐng)域,它幫助我們理解和分析與地理位置相關(guān)的數(shù)據(jù),Python?提供了強(qiáng)大的工具來處理地理數(shù)據(jù),本文將介紹如何使用?Python?Matplotlib?處理地理數(shù)據(jù)可視化,包括基礎(chǔ)概念、常用庫、數(shù)據(jù)處理以及實(shí)際案例,需要的朋友可以參考下
    2024-11-11
  • Python實(shí)現(xiàn)的簡單計算器功能詳解

    Python實(shí)現(xiàn)的簡單計算器功能詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)的簡單計算器功能,結(jié)合實(shí)例形式詳細(xì)分析了Python實(shí)現(xiàn)計算器功能的具體步驟、相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2018-08-08
  • python讀取注冊表中值的方法

    python讀取注冊表中值的方法

    在Python的標(biāo)準(zhǔn)庫中,_winreg.pyd可以操作Windows的注冊表,另外第三方的win32庫封裝了大量的Windows API,使用起來也很方便。不過這里介紹的是使用_winreg操作注冊表,畢竟是Python自帶的標(biāo)準(zhǔn)庫,無需安裝第三方庫
    2013-04-04
  • 解決Python3.5+OpenCV3.2讀取圖像的問題

    解決Python3.5+OpenCV3.2讀取圖像的問題

    今天小編就為大家分享一篇解決Python3.5+OpenCV3.2讀取圖像的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 在Python中使用M2Crypto模塊實(shí)現(xiàn)AES加密的教程

    在Python中使用M2Crypto模塊實(shí)現(xiàn)AES加密的教程

    這篇文章主要介紹了在Python中使用M2Crypto模塊實(shí)現(xiàn)AES加密的教程,例子中的方法使用aes_128_ecb算法,需要的朋友可以參考下
    2015-04-04
  • Python繪圖之實(shí)現(xiàn)繪制極坐標(biāo)圖像

    Python繪圖之實(shí)現(xiàn)繪制極坐標(biāo)圖像

    這篇文章主要介紹了如何利用python繪制極坐標(biāo)圖像,文中的示例代碼講解詳細(xì),具有一定的的參考價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • 基于Python編寫簡易文字語音轉(zhuǎn)換器

    基于Python編寫簡易文字語音轉(zhuǎn)換器

    這篇文章主要為大家介紹了如何利用Python編寫一個簡易文字語音轉(zhuǎn)換器,并打包成exe。文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起嘗試一下
    2022-03-03
  • Python進(jìn)階篇之字典操作總結(jié)

    Python進(jìn)階篇之字典操作總結(jié)

    字典是Python語言中唯一的映射類型。字典對象是可變的,它是一個容器類型,能存儲任意個數(shù)的Python對象,其中也可包括其他容器類型。在學(xué)習(xí)了 Python 基本的字典操作后,通過學(xué)習(xí)本文的這些進(jìn)階操作,讓寫出的代碼更加優(yōu)雅簡潔和pythonic。下面來一起看看吧。
    2016-11-11

最新評論

雷山县| 项城市| 巴林右旗| 临高县| 大邑县| 穆棱市| 太原市| 汝南县| 汤原县| 华宁县| 喀喇| 修武县| 林周县| 德庆县| 台北县| 青神县| 米泉市| 桦川县| 故城县| 兴国县| 托克逊县| 巴中市| 尚志市| 星座| 江华| 迁安市| 安泽县| 渑池县| 商丘市| 潢川县| 云林县| 邵阳市| 遵义县| 淮南市| 伽师县| 明光市| 长兴县| 尤溪县| 安乡县| 抚顺市| 芒康县|