使用2位二進位制輸入的異或邏輯閘人工神經網路


介紹

人工神經網路 (ANN) 已成為機器學習領域中有效的工具,使我們能夠解決傳統計算方法曾認為具有挑戰性的複雜問題。其中一個問題是異或邏輯閘,這是一個基本示例,突出了某些邏輯運算的非線性特性。異或門有兩個二進位制輸入,並且只有當輸入不同時才產生真輸出。在本文中,我們將探討如何實現一個專門設計用於解決具有 2 位二進位制輸入的異或問題的人工神經網路。

理解異或邏輯閘

異或 (XOR) 邏輯閘對兩個二進位制輸入進行運算,如果輸入不同則產生真輸出,如果輸入相同則產生假輸出。

2 位異或門的真值表如下所示

輸入 A

輸入 B

輸出

0

0

0

0

1

1

1

0

1

1

1

0

從真值表可以看出,異或門的輸出無法用單個線性方程表示。這種非線性特性使得它成為傳統計算方法的一個具有挑戰性的問題。然而,人工神經網路擅長解決此類非線性問題。

異或邏輯閘人工神經網路的實現

演算法

步驟 1: 初始化輸入並比較異或邏輯閘的輸出。

步驟 2: 定義 sigmoid 啟用函式及其導數 sm_derivative(x)

步驟 3: 隨機初始化權重,均值為 0。權重是連線不同層神經元的矩陣。

步驟 4: 設定訓練迭代次數。

步驟 5: 開始 epoch 範圍內的訓練迴圈。

步驟 6: 執行前向傳播

  • 將 l0 設定為輸入層。

  • 計算 l1,它是將 sigmoid 啟用函式應用於 l0 和 w0 的點積的結果。

  • 計算 l2,它是將 sigmoid 啟用函式應用於 l1 和 w1 的點積的結果。

步驟 7: 執行反向傳播

  • 計算預測輸出和實際輸出之間的誤差。

  • 透過將 layer2_error 與應用於 l2 的 sigmoid 函式的導數相乘來計算 layer2_delta。

  • 透過取 layer2_delta 和 w1 的轉置的乘積來計算隱藏層的誤差。

  • 透過將 layer1_error 與應用於 l1 的 sigmoid 函式的導數相乘來計算 layer1_delta。

步驟 8: 更新權重

  • 透過新增 l1 的轉置和 layer2_delta 的點積來更新 w1。

  • 透過新增 l0 的轉置和 layer1_delta 的點積來更新 w0。

  • 透過向訓練好的網路提供測試輸入來測試神經網路。

步驟 9: 透過使用訓練好的權重對 test_input 執行前向傳播來計算 predicted_output。將 sigmoid 函式應用於 predicted_output 並四捨五入值以獲得最終的預測輸出。

步驟 10: 透過突出顯示測試輸入並比較預測輸出,列印每個輸入的預測輸出。

示例

#import the required module
import numpy as np

#define a sigmoid function
def sm(x):
    return 1 / (1 + np.exp(-x))

def sm_derivative(x):
    return x * (1 - x)

inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
outputs = np.array([[0], [1], [1], [0]])

np.random.seed(42)


w0 = 2 * np.random.random((2, 4)) - 1
w1 = 2 * np.random.random((4, 1)) - 1


epochs = 10000


for epoch in range(epochs):
    
    l0 = inputs
    l1 = sm(np.dot(l0, w0))
    l2 = sm(np.dot(l1, w1))
    

    layer2_error = outputs - l2
    layer2_delta = layer2_error * sm_derivative(l2)
    layer1_error = layer2_delta.dot(w1.T)
    layer1_delta = layer1_error * sm_derivative(l1)
    
    
    w1 += l1.T.dot(layer2_delta)
    w0 += l0.T.dot(layer1_delta)


ti = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
pr = sm(np.dot(sm(np.dot(ti, w0)), w1))
pr = np.round(pr)


for i in range(len(ti)):
    print(f"Input: {ti[i]}, Estimated Output: {pr[i]}")

輸出

Input: [0 0], Estimated Output: [0.] 
Input: [0 1], Estimated Output: [1.] 
Input: [1 0], Estimated Output: [1.] 
Input: [1 1], Estimated Output: [0.] 

結論

異或神經網路為理解非線性問題提供了基礎,其應用範圍超出了二進位制邏輯閘。它們能夠處理影像識別和自然語言處理等任務。但是,它們的效能在很大程度上取決於訓練資料的質量和多樣性。此外,在設計和訓練異或網路時,必須考慮問題的複雜性和可用的計算資源。隨著對神經網路模型的研究和進步的繼續,我們可以預期未來會出現更先進的模型來處理日益複雜的問題。

更新於:2023年7月26日

1K+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告