使用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+ 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告