使用Python实现一个简单的神经网络分类器
神经网络是深度学习的核心技术之一,广泛应用于图像识别、自然语言处理、语音识别等领域。本文将介绍如何使用 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