使用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.]
结论
异或神经网络为理解非线性问题提供了基础,其应用范围超出了二进制逻辑门。它们能够处理图像识别和自然语言处理等任务。但是,它们的性能在很大程度上取决于训练数据的质量和多样性。此外,在设计和训练异或网络时,必须考虑问题的复杂性和可用的计算资源。随着对神经网络模型的研究和进步的继续,我们可以预期未来会出现更先进的模型来处理日益复杂的问题。