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

52分钟前 3阅读

神经网络是深度学习的核心技术之一,广泛应用于图像识别、自然语言处理、语音识别等领域。本文将介绍如何使用 Python 实现一个简单的神经网络分类器,并在经典的 MNIST 手写数字数据集上进行训练和测试。我们将从零开始构建神经网络模型,包括数据预处理、前向传播、损失计算、反向传播以及优化过程。

本教程适合具备一定 Python 编程基础和机器学习基础知识的读者。代码部分将使用 numpy 库来实现矩阵运算,并通过 matplotlib 进行可视化展示。


1. 环境准备

首先确保安装了以下依赖库:

pip install numpy matplotlib scikit-learn

2. 数据加载与预处理

我们使用 sklearn.datasets 中的 fetch_openml 方法来加载 MNIST 数据集。

import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import fetch_openmlfrom sklearn.model_selection import train_test_split# 加载MNIST数据集mnist = fetch_openml('mnist_784', version=1)X, y = mnist["data"], mnist["target"]y = y.astype(np.uint8)# 将标签转换为one-hot编码def one_hot_encode(y):    one_hot = np.zeros((y.size, 10))    one_hot[np.arange(y.size), y] = 1    return one_hot# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)y_train_one_hot = one_hot_encode(y_train)y_test_one_hot = one_hot_encode(y_test)# 归一化X_train = X_train / 255.0X_test = X_test / 255.0

3. 构建神经网络结构

我们构建一个包含输入层、隐藏层和输出层的三层全连接神经网络。

class NeuralNetwork:    def __init__(self, input_size, hidden_size, output_size):        # 初始化权重和偏置        self.W1 = np.random.randn(input_size, hidden_size) * 0.01        self.b1 = np.zeros((1, hidden_size))        self.W2 = np.random.randn(hidden_size, output_size) * 0.01        self.b2 = np.zeros((1, output_size))    def sigmoid(self, x):        return 1 / (1 + np.exp(-x))    def softmax(self, x):        exps = np.exp(x - np.max(x, axis=1, keepdims=True))        return exps / np.sum(exps, axis=1, keepdims=True)    def forward(self, X):        # 前向传播        self.Z1 = X @ self.W1 + self.b1        self.A1 = self.sigmoid(self.Z1)        self.Z2 = self.A1 @ self.W2 + self.b2        self.A2 = self.softmax(self.Z2)        return self.A2    def compute_loss(self, y_true, y_pred):        m = y_true.shape[0]        loss = -np.sum(y_true * np.log(y_pred + 1e-15)) / m        return loss    def backward(self, X, y_true):        m = X.shape[0]        # 输出层误差        dZ2 = self.A2 - y_true        dW2 = self.A1.T @ dZ2 / m        db2 = np.sum(dZ2, axis=0, keepdims=True) / m        # 隐藏层误差        dA1 = dZ2 @ self.W2.T        dZ1 = dA1 * self.A1 * (1 - self.A1)        dW1 = X.T @ dZ1 / m        db1 = np.sum(dZ1, axis=0, keepdims=True) / m        # 更新参数        learning_rate = 0.1        self.W2 -= learning_rate * dW2        self.b2 -= learning_rate * db2        self.W1 -= learning_rate * dW1        self.b1 -= learning_rate * db1    def train(self, X, y, epochs=100, batch_size=64):        losses = []        for epoch in range(epochs):            permutation = np.random.permutation(X.shape[0])            X_shuffled = X[permutation]            y_shuffled = y[permutation]            for i in range(0, X.shape[0], batch_size):                X_batch = X_shuffled[i:i+batch_size]                y_batch = y_shuffled[i:i+batch_size]                y_pred = self.forward(X_batch)                loss = self.compute_loss(y_batch, y_pred)                self.backward(X_batch, y_batch)            if epoch % 10 == 0:                print(f"Epoch {epoch}, Loss: {loss:.4f}")            losses.append(loss)        return losses    def predict(self, X):        y_pred = self.forward(X)        return np.argmax(y_pred, axis=1)    def accuracy(self, X, y):        predictions = self.predict(X)        return np.mean(predictions == y)

4. 模型训练与评估

接下来,我们使用上面定义的神经网络类进行训练并评估其性能。

# 初始化模型input_size = 784hidden_size = 128output_size = 10nn = NeuralNetwork(input_size, hidden_size, output_size)# 训练模型losses = nn.train(X_train.values, y_train_one_hot, epochs=100, batch_size=128)# 绘制损失曲线plt.plot(losses)plt.xlabel("Epoch")plt.ylabel("Loss")plt.title("Training Loss Curve")plt.show()# 测试准确率test_accuracy = nn.accuracy(X_test.values, y_test)print(f"Test Accuracy: {test_accuracy * 100:.2f}%")

5. 可视化预测结果

我们可以随机选取一些样本,可视化模型预测的结果。

import random# 随机选择10个样本进行预测indices = random.sample(range(len(X_test)), 10)for i in indices:    sample = X_test.iloc[i].values.reshape(1, -1)    prediction = nn.predict(sample)[0]    label = y_test.iloc[i]    plt.imshow(X_test.iloc[i].values.reshape(28, 28), cmap='gray')    plt.title(f"Label: {label}, Prediction: {prediction}")    plt.axis('off')    plt.show()

6. 总结与展望

通过本文,我们实现了从头构建一个简单的三层神经网络,并在 MNIST 数据集上进行了训练和测试。虽然这个网络相对简单,但它展示了神经网络的基本原理:前向传播、损失计算、反向传播和参数更新。

未来可以进一步扩展的方向包括:

使用更复杂的网络结构(如卷积神经网络)引入正则化方法防止过拟合使用更高效的优化器(如 Adam)使用 PyTorch 或 TensorFlow 等深度学习框架提高开发效率

希望本文能帮助你更好地理解神经网络的工作原理,并为进一步深入学习深度学习打下基础。

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

目录[+]

您是本站第82369名访客 今日有22篇新文章

微信号复制成功

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