成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從零開始構建簡單人工神經網絡:1個輸入層和1個輸出層

譯文
人工智能 深度學習
本上下篇將介紹僅使用numpy Python庫從零開始構建人工神經網絡(ANN)。上篇將介紹構建一個很簡單的ANN,只有1個輸入層和1個輸出層,沒有隱藏層。下篇將介紹構建一個有1個輸入層、1個隱藏層和1個輸出層的ANN。

【51CTO.com快譯】本上下篇將介紹僅使用numpy Python庫從零開始構建人工神經網絡(ANN)。

上篇將介紹構建一個很簡單的ANN,只有1個輸入層和1個輸出層,沒有隱藏層。

下篇將介紹構建一個有1個輸入層、1個隱藏層和1個輸出層的ANN。

為何從零開始?

有許多深度學習庫(Keras、TensorFlow和PyTorch等)可僅用幾行代碼構建一個神經網絡。然而,如果你真想了解神經網絡的底層運作,建議學習如何使用Python或任何其他編程語言從零開始為神經網絡編程。

不妨創建某個隨機數據集:

圖1. 為簡單起見,隨機數據集帶二進制值

上面表格有五列:Person、X1、X2、X3和Y。1表示true,0表示false。我們的任務是創建一個能夠基于X1、X2和X3的值來預測Y值的人工神經網絡。

我們將創建一個有1個輸入層、1個輸出層而沒有隱藏層的人工神經網絡。開始編程前,先不妨看看我們的神經網絡在理論上將如何執行:

ANN理論

人工神經網絡是一種監督式學習算法,這意味著我們為它提供含有自變量的輸入數據和含有因變量的輸出數據。比如在該示例中,自變量是X1、X2和X3,因變量是Y。

首先,ANN進行一些隨機預測,將這些預測與正確的輸出進行比較,計算出誤差(預測值與實際值之間的差)。找出實際值與傳播值之間的差異的函數名為成本函數(cost function)。這里的成本指誤差。我們的目標是使成本函數最小化。訓練神經網絡基本上是指使成本函數最小化。下面會介紹如何執行此任務。

神經網絡分兩個階段執行:前饋階段和反向傳播階段。下面詳細介紹這兩個步驟。

前饋

圖2

來源:單層神經網絡,又叫Perceptron

在ANN的前饋階段,基于輸入節點中的值和權重進行預測。如果看一下上圖中的神經網絡,會看到數據集中有三個特征:X1、X2和X3,因此第一層(又叫輸入層)中有三個節點。

神經網絡的權重基本上是我們要調整的字符串,以便能夠正確預測輸出。請記住,每個輸入特性只有一個權重。

以下是在ANN的前饋階段所執行的步驟:

第1步:計算輸入和權重之間的點積

輸入層中的節點通過三個權重參數與輸出層連接。在輸出層中,輸入節點中的值與對應的權重相乘并相加。最后,偏置項b添加到總和。

為什么需要偏置項?

假設某個人有輸入值(0,0,0),輸入節點和權重的乘積之和將為零。在這種情況下,無論我們怎么訓練算法,輸出都將始終為零。因此,為了能夠做出預測,即使我們沒有關于該人的任何非零信息,也需要一個偏置項。偏置項對于構建穩健的神經網絡而言必不可少。

數學上,點積的總和:

X.W=x1.w1 + x2.w2 + x3.w3 + b

第2步:通過激活函數傳遞點積(X.W)的總和

點積XW可以生成任何一組值。然而在我們的輸出中,我們有1和0形式的值。我們希望輸出有同樣的格式。為此,我們需要一個激活函數(Activation Function),它將輸入值限制在0到1之間。因此,我們當然會使用Sigmoid激活函數。

圖3. Sigmoid激活函數

輸入為0時,Sigmoid函數返回0.5。如果輸入是大正數,返回接近1的值。負輸入的情況下,Sigmoid函數輸出的值接近零。

因此,它特別適用于我們要預測概率作為輸出的模型。由于概念只存在于0到1之間,Sigmoid函數是適合我們這個問題的選擇。

上圖中z是點積X.W的總和。

數學上,Sigmoid激活函數是:

圖4. Sigmoid激活函數

總結一下到目前為止所做的工作。首先,我們要找到帶權重的輸入特征(自變量矩陣)的點積。接著,通過激活函數傳遞點積的總和。激活函數的結果基本上是輸入特征的預測輸出。

反向傳播

一開始,進行任何訓練之前,神經網絡進行隨機預測,這種預測當然是不正確的。

我們先讓網絡做出隨機輸出預測。然后,我們將神經網絡的預測輸出與實際輸出進行比較。接下來,我們更新權重和偏置,并確保預測輸出更接近實際輸出。在這個階段,我們訓練算法。不妨看一下反向傳播階段涉及的步驟。

第1步:計算成本

此階段的第一步是找到預測成本。可以通過找到預測輸出值和實際輸出值之間的差來計算預測成本。如果差很大,成本也將很大。

我們將使用均方誤差即MSE成本函數。成本函數是找到給定輸出預測成本的函數。

圖5. 均方誤差

這里,Yi是實際輸出值,Ŷi是預測輸出值,n是觀察次數。

第2步:使成本最小化

我們的最終目的是微調神經網絡的權重,并使成本最小化。如果你觀察仔細,會了解到我們只能控制權重和偏置,其他一切不在控制范圍之內。我們無法控制輸入,無法控制點積,無法操縱Sigmoid函數。

為了使成本最小化,我們需要找到權重和偏置值,確保成本函數返回最小值。成本越小,預測就越正確。

要找到函數的最小值,我們可以使用梯度下降算法。梯度下降可以用數學表示為:

圖6. 使用梯度下降更新權重

𝛛Error是成本函數。上面的等式告訴我們找到關于每個權重和偏置的成本函數的偏導數,然后從現有權重中減去結果以得到新的權重。

函數的導數給出了在任何給定點的斜率。為了找到成本是增加還是減少,給定權重值,我們可以找到該特定權重值的函數導數。如果成本隨重量增加而增加,導數將返回正值,然后將其從現有值中減去。

另一方面,如果成本隨重量增加而降低,將返回負值,該值將被添加到現有的權重值中,因為負負得正。

在上面公式中,a名為學習速率,乘以導數。學習速率決定了我們的算法學習的速度。

我們需要對所有權重和偏置重復執行梯度下降操作,直到成本最小化,并且成本函數返回的值接近零。

現在是實現我們迄今為止研究的人工神經網絡的時候了。我們將用Python創建一個簡單的神經網絡,有1個輸入層和1個輸出層。

使用numpy實現人工神經網絡

圖7

圖片來源:hackernoon.com

要采取的步驟:

1.定義自變量和因變量

2.定義超參數

3.定義激活函數及其導數

4.訓練模型

5.做出預測

第1步:先創建自變量或輸入特征集以及相應的因變量或標簽。

  1. #Independent variables  
  2. input_set = np.array([[0,1,0],  
  3. [0,0,1],  
  4. [1,0,0],  
  5. [1,1,0],  
  6. [1,1,1],  
  7. [0,1,1],  
  8. [0,1,0]])#Dependent variable  
  9. labels = np.array([[1,  
  10. 0,  
  11. 0,  
  12. 1,  
  13. 1,  
  14. 0,  
  15. 1]])  
  16. labels = labels.reshape(7,1) #to convert labels to vector 

我們的輸入集含有七個記錄。同樣,我們還創建了一個標簽集,含有輸入集中每個記錄的對應標簽。標簽是我們希望ANN預測的值。

第2步:定義超參數。

我們將使用numpy的random.seed函數,以便在執行以下代碼時可以獲得同樣的隨機值。

接下來,我們使用正態分布的隨機數初始化權重。由于輸入中有三個特征,因此我們有三個權重的向量。然后,我們使用另一個隨機數初始化偏置值。最后,我們將學習速率設置為0.05。

  1. np.random.seed(42)  
  2. weights = np.random.rand(3,1)  
  3. bias = np.random.rand(1)  
  4. lr = 0.05 #learning rate 

第3步:定義激活函數及其導數:我們的激活函數是Sigmoid函數。

  1. def sigmoid(x):  
  2. return 1/(1+np.exp(-x)) 

現在定義計算Sigmoid函數導數的函數。

  1. def sigmoid_derivative(x):  
  2. return sigmoid(x)*(1-sigmoid(x)) 

第4步:是時候訓練ANN模型了。

我們將從定義輪次(epoch)數量開始。輪次是我們想針對數據集訓練算法的次數。我們將針對數據訓練算法25000次,因此epoch將為25000。可以嘗試不同的數字以進一步降低成本。

  1. for epoch in range(25000):  
  2. inputs = input_set  
  3. XW = np.dot(inputs, weights)+ bias  
  4. z = sigmoid(XW)  
  5. error = z - labels  
  6. print(error.sum())  
  7. dcost = error  
  8. dpred = sigmoid_derivative(z)  
  9. z_del = dcost * dpred  
  10. inputs = input_set.T  
  11. weights = weights - lr*np.dot(inputs, z_del)  
  12. for num in z_del:  
  13. bias = bias - lr*num 

不妨了解每個步驟,然后進入到預測的最后一步。

我們將輸入input_set中的值存儲到input變量中,以便在每次迭代中都保留input_set的值不變。

  1. inputs = input_set 

接下來,我們找到輸入和權重的點積,并為其添加偏置。(前饋階段的第1步)

  1. XW = np.dot(inputs, weights)+ bias 

接下來,我們通過Sigmoid激活函數傳遞點積。(前饋階段的第2步)

  1. z = sigmoid(XW) 

這就完成了算法的前饋部分,現在是開始反向傳播的時候了。

變量z含有預測的輸出。反向傳播的第一步是找到誤差。

  1. error = z - labels  
  2. print(error.sum()) 

我們知道成本函數是:

圖8

我們需要從每個權重方面求該函數的微分,這可以使用微分鏈式法則(chain rule of differentiation)來輕松完成。我將跳過推導部分,但如果有人感興趣,請留言。

因此,就任何權重而言,成本函數的最終導數是:

  1. slope = input x dcost x dpred 

現在,斜率可以簡化為:

  1. dcost = error  
  2. dpred = sigmoid_derivative(z) 
  3. z_del = dcost * dpred  
  4. inputs = input_set.T  
  5. weights = weight-lr*np.dot(inputs, z_del) 

我們有z_del變量,含有dcost和dpred的乘積。我們拿輸入特征矩陣的轉置與z_del相乘,而不是遍歷每個記錄并拿輸入與對應的z_del相乘。

最后,我們將學習速率變量lr與導數相乘,以加快學習速度。

除了更新權重外,我們還要更新偏置項。

  1. for num in z_del:  
  2. bias = bias - lr*num 

一旦循環開始,你會看到總誤差開始減小;訓練結束時,誤差將保留為很小的值。

  1. -0.001415035616137969  
  2. -0.0014150128584959256  
  3. -0.0014149901015685952  
  4. -0.0014149673453557714  
  5. -0.0014149445898578358  
  6. -0.00141492183507419  
  7. -0.0014148990810050437  
  8. -0.0014148763276499686  
  9. -0.0014148535750089977  
  10. -0.0014148308230825385  
  11. -0.0014148080718707524  
  12. -0.0014147853213728624  
  13. -0.0014147625715897338  
  14. -0.0014147398225201734  
  15. -0.0014147170741648386  
  16. -0.001414694326523502  
  17. -0.001414671579597255  
  18. -0.0014146488333842064  
  19. -0.0014146260878853782  
  20. -0.0014146033431002465  
  21. -0.001414580599029179  
  22. -0.0014145578556723406  
  23. -0.0014145351130293877  
  24. -0.0014145123710998  
  25. -0.0014144896298846701  
  26. -0.0014144668893831067  
  27. -0.001414444149595611  
  28. -0.0014144214105213174  
  29. -0.0014143986721605849  
  30. -0.0014143759345140276  
  31. -0.0014143531975805163  
  32. -0.001414330461361444  
  33. -0.0014143077258557749  
  34. -0.0014142849910631708  
  35. -0.00141426225698401  
  36. -0.0014142395236186895  
  37. -0.0014142167909661323  
  38. -0.001414194059027955  
  39. -0.001414171327803089  
  40. -0.001414148597290995  
  41. -0.0014141258674925626  
  42. -0.0014141031384067547  
  43. -0.0014140804100348098  
  44. -0.0014140576823759854  
  45. -0.0014140349554301636  
  46. -0.0014140122291978665  
  47. -0.001413989503678362  
  48. -0.001413966778871751  
  49. -0.001413944054778446  
  50. -0.0014139213313983257  
  51. -0.0014138986087308195  
  52. -0.0014138758867765552  
  53. -0.0014138531655347973  
  54. -0.001413830445006264  
  55. -0.0014138077251906606  
  56. -0.001413785006087985  
  57. -0.0014137622876977014  
  58. -0.0014137395700206355  
  59. -0.0014137168530558228  
  60. -0.0014136941368045382  
  61. -0.0014136714212651114  
  62. -0.0014136487064390219  
  63. -0.0014136259923249635  
  64. -0.001413603278923519  
  65. -0.0014135805662344007  
  66. -0.0014135578542581566  
  67. -0.0014135351429944293  
  68. -0.0014135124324428719  
  69. -0.0014134897226037203  
  70. -0.0014134670134771238  
  71. -0.0014134443050626295  
  72. -0.0014134215973605428  
  73. -0.0014133988903706311 

第5步:作出預測

是時候作出一些預測了。先用[1,0,0]試一下:

  1. single_pt = np.array([1,0,0])  
  2. result = sigmoid(np.dot(single_pt, weights) + bias)  
  3. print(result) 

輸出:

  1. [0.01031463] 

如你所見,輸出更接近0而不是1,因此分類為0。

不妨再用[0,1,0]試一下:

  1. single_pt = np.array([0,1,0])  
  2. result = sigmoid(np.dot(single_pt, weights) + bias)  
  3. print(result)   

 

輸出:

  1. [0.99440207] 

如你所見,輸出更接近1而不是0,因此分類為1。

結論

我們在本文中學習了如何使用numpy Python庫,從零開始創建一個很簡單的人工神經網絡,只有1個輸入層和1個輸出層。該ANN能夠對線性可分離數據進行分類。

如果我們有非線性可分離的數據,我們的ANN就無法對這種類型的數據進行分類。下篇將介紹如何構建這樣的ANN。

原文標題:Build an Artificial Neural Network From Scratch: Part 1,作者:Nagesh Singh Chauhan

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

 

責任編輯:龐桂玉 來源: 51CTO
相關推薦

2020-03-26 09:00:00

神經網絡AI人工智能

2020-12-27 21:09:50

神經網絡AI

2018-05-28 13:12:49

深度學習Python神經網絡

2024-05-27 09:00:00

2018-01-09 10:05:55

神經網絡ClojureCortex

2025-02-19 18:00:00

神經網絡模型AI

2012-10-09 10:57:57

光纖iODN寬帶

2018-09-17 15:12:25

人工智能神經網絡編程語言

2018-08-27 17:05:48

tensorflow神經網絡圖像處理

2021-08-25 13:13:58

神經網絡AI算法

2018-07-03 16:10:04

神經網絡生物神經網絡人工神經網絡

2024-07-31 08:14:17

2024-03-01 19:53:37

PyBuilderPython開發

2017-02-10 09:30:33

數據化運營流量

2010-02-22 09:39:52

HTML 5Web

2015-03-06 17:24:56

Android應用安全安卓應用安全

2024-11-05 16:19:55

2022-06-02 09:09:27

前端React低代碼編輯器

2019-07-12 07:26:26

神經網絡數學樂高

2025-01-09 11:14:13

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 综合另类 | 日韩中文字幕一区 | 成人黄色电影免费 | 欧美性猛片aaaaaaa做受 | 国精品一区二区 | 999久久久| 亚洲二区在线观看 | 国产成人短视频在线观看 | 黄色网址在线免费观看 | 日本精品视频一区二区三区四区 | 在线成人 | 五月激情综合 | 亚洲免费视频在线观看 | 国产精品国产a级 | 久久91精品久久久久久9鸭 | 91一区二区三区在线观看 | 91在线精品视频 | 亚洲人成一区二区三区性色 | 欧美二区乱c黑人 | 91社区视频 | 精品国产精品三级精品av网址 | 精产国产伦理一二三区 | 久久精品国产一区二区三区 | 9色视频在线 | 欧美综合国产精品久久丁香 | 涩在线| 超碰97干| 成人网址在线观看 | 精品视频一区二区 | 国产精品国产三级国产aⅴ原创 | 久久久青草 | 国产精品伦理一区 | 91美女在线 | 成人伊人 | 欧美一区二区综合 | 暴草美女 | 日韩欧美一级 | 国内久久 | 国产精品久久久久aaaa九色 | 日韩精品免费在线 | 久久精品视频在线免费观看 |