使用Python实现一个简单的神经网络

52分钟前 3阅读

在人工智能和机器学习领域,神经网络是一个非常重要的概念。它模仿人类大脑的工作方式,通过大量的连接和权重调整来完成模式识别、分类和预测等任务。本文将介绍如何使用 Python 实现一个简单的神经网络,并通过代码展示其训练过程。

我们将从头开始构建一个具有单隐藏层的全连接神经网络,用于解决二分类问题。为了简化理解,我们不会使用深度学习框架(如 TensorFlow 或 PyTorch),而是使用 NumPy 来进行矩阵运算。


1. 神经网络的基本结构

一个典型的神经网络由输入层、隐藏层和输出层组成。每一层都包含多个神经元,每个神经元与前一层的所有神经元相连,并通过加权求和后经过激活函数处理。

本例中,我们设计一个具有以下结构的神经网络:

输入层:2个节点隐藏层:3个节点输出层:1个节点

2. 激活函数

激活函数是神经网络中的关键组成部分,它引入非线性因素,使模型能够拟合复杂的关系。我们将在隐藏层使用 Sigmoid 函数,在输出层也使用 Sigmoid 函数,因为这是一个二分类问题。

Sigmoid 函数定义如下:

$$\sigma(x) = \frac{1}{1 + e^{-x}}$$

其导数为:

$$\sigma'(x) = \sigma(x)(1 - \sigma(x))$$


3. 构建神经网络类

下面是我们用 Python 编写的神经网络类,使用 NumPy 进行矩阵计算:

import numpy as npclass NeuralNetwork:    def __init__(self, input_size, hidden_size, output_size):        # 初始化权重        self.W1 = np.random.randn(input_size, hidden_size)        self.b1 = np.zeros((1, hidden_size))        self.W2 = np.random.randn(hidden_size, output_size)        self.b2 = np.zeros((1, output_size))    def sigmoid(self, x):        return 1 / (1 + np.exp(-x))    def sigmoid_derivative(self, x):        return x * (1 - x)    def forward(self, X):        # 前向传播        self.z1 = np.dot(X, self.W1) + self.b1        self.a1 = self.sigmoid(self.z1)        self.z2 = np.dot(self.a1, self.W2) + self.b2        self.a2 = self.sigmoid(self.z2)        return self.a2    def backward(self, X, y, learning_rate=0.1):        # 反向传播        m = X.shape[0]        # 输出误差        dz2 = (self.a2 - y) * self.sigmoid_derivative(self.a2)        dW2 = np.dot(self.a1.T, dz2) / m        db2 = np.sum(dz2, axis=0, keepdims=True) / m        # 隐藏层误差        dz1 = np.dot(dz2, self.W2.T) * self.sigmoid_derivative(self.a1)        dW1 = np.dot(X.T, dz1) / m        db1 = np.sum(dz1, axis=0, keepdims=True) / m        # 更新权重        self.W1 -= learning_rate * dW1        self.b1 -= learning_rate * db1        self.W2 -= learning_rate * dW2        self.b2 -= learning_rate * db2    def train(self, X, y, epochs=1000, learning_rate=0.1):        for epoch in range(epochs):            y_hat = self.forward(X)            loss = np.mean(np.square(y_hat - y))  # 均方误差损失            self.backward(X, y, learning_rate)            if epoch % 100 == 0:                print(f"Epoch {epoch}, Loss: {loss:.4f}")    def predict(self, X):        return self.forward(X)

4. 数据准备与训练

为了演示这个神经网络的效果,我们可以构造一个简单的数据集来进行训练。例如,使用 XOR 逻辑门的数据:

x1x2y
000
011
101
110

这是经典的非线性可分问题,适合测试神经网络的学习能力。

if __name__ == "__main__":    # XOR 数据集    X = np.array([[0, 0],                  [0, 1],                  [1, 0],                  [1, 1]])    y = np.array([[0], [1], [1], [0]])    # 创建神经网络实例    nn = NeuralNetwork(input_size=2, hidden_size=3, output_size=1)    # 训练模型    nn.train(X, y, epochs=2000, learning_rate=0.5)    # 测试模型    predictions = nn.predict(X)    print("预测结果:")    print(predictions.round())

输出示例:

Epoch 0, Loss: 0.2497Epoch 100, Loss: 0.2493...Epoch 1900, Loss: 0.0001预测结果:[[0.] [1.] [1.] [0.]]

可以看到,随着训练轮次的增加,损失逐渐减小,最终模型成功学会了 XOR 的逻辑关系。


5. 总结与扩展

本文介绍了如何使用 Python 和 NumPy 手动实现一个简单的神经网络。我们实现了:

神经网络的基本结构前向传播与反向传播算法激活函数(Sigmoid)损失函数(均方误差)训练流程

虽然这个神经网络比较简单,但它为我们理解更复杂的深度学习模型打下了基础。

后续改进方向:

引入更多隐藏层,构建深层网络使用 ReLU 替代 Sigmoid 激活函数以缓解梯度消失问题添加正则化项防止过拟合使用 mini-batch 梯度下降优化训练效率将代码封装成模块,方便复用

6.

手动实现神经网络有助于我们深入理解其内部机制。虽然现代深度学习框架提供了便利,但在某些场景下,掌握底层原理仍然非常重要。希望这篇文章对你理解和实践神经网络有所帮助!

如果你对这个项目感兴趣,可以尝试将其扩展到多分类问题或图像识别任务中,进一步提升你的机器学习技能。

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第57461名访客 今日有25篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!