Python利用三层神经网络实现手写数字分类详解
本攻略将介绍如何使用Python利用三层神经网络实现手写数字分类。我们将介绍神经网络的原理和实现方法,并提供两个示例来演示如何使用Python实现手写数字分类。
神经网络原理
神经网络是一种模拟人脑神经元工作方式的计算模型。它由多个神经元组成,每个神经元接收个输入,经过加权和激活函数处理后输出一个结果。神经网络的训练过程就是通过调整神经元之间的权重,使得神经网络能够更好地拟合训练数据。
三层神经网络是一种最简单的神经网络模型,它包含输入层、隐藏层和输出层。输入层接收输入数据,隐藏层对输入数据进行处理,输出层输出结果。在手写数字分类问题中,输入层包含784个神经元(28×28像素),隐藏层包含一个或多个神经元,输出层包含10个神经元(0-9数字)。
Python实现神经网络
以下是使用Python实现三层神经网络的示例代码:
import numpy as np
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.weights1 = np.random.randn(self.input_size, self.hidden_size)
self.weights2 = np.random.randn(self.hidden_size, self.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.hidden_layer = self.sigmoid(np.dot(X, self.weights1))
self.output_layer = self.sigmoid(np.dot(self.hidden_layer, self.weights2))
return self.output_layer
def backward(self, X, y, output):
self.output_error = y - output
self.output_delta = self.output_error * self.sigmoid_derivative(output)
self.hidden_error = np.dot(self.output_delta, self.weights2.T)
self.hidden_delta = self.hidden_error * self.sigmoid_derivative(self.hidden_layer)
self.weights1 += np.dot(X.T, self.hidden_delta)
self.weights2 += np.dot(self.hidden_layer.T, self.output_delta)
def train(self, X, y, epochs):
for i in range(epochs):
output = self.forward(X)
self.backward(X, y, output)
def predict(self, X):
return np.argmax(self.forward(X), axis=1)
在这个示例中,我们定义了一个NeuralNetwork类,它包含三个方法:init()、sigmoid()和train()。init()方法用于初始化神经网络的权重,sigmoid()方法用于计算sigmoid函数的值,train()方法用于训练神经网络。
示例说明
以下是使用Python实现手写数字分类的示例:
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
# 加载手写数字数据集
digits = load_digits()
# 数据预处理
X = digits.data
y = digits.target
X = StandardScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练神经网络
nn = NeuralNetwork(input_size=64, hidden_size=32, output_size=10)
nn.train(X_train, np.eye(10)[y_train], epochs=1000)
# 预测测试集
y_pred = nn.predict(X_test)
# 输出准确率
print('Accuracy:', accuracy_score(y_test, y_pred))
在这个示例中,我们首先使用sklearn库中的load_digits()函数加载手写数字数据集。然后我们对数据进行预处理,包括标准化和划分训练集和测试集。接着我们使用NeuralNetwork类训练神经网络,并使用predict()方法预测集。最后,我们输出准确率。
以下是另一个示例,演示如何使用神经网络对手写数字进行分类并可视化结果:
import matplotlib.pyplot as plt
# 随机选择一个测试样本
index = np.random.randint(0, len(X_test))
x = X_test[index]
y_true = y_test[index]
# 预测结果
y_pred = nn.predict(x.reshape(1, -1))[0]
# 可视化结果
plt.imshow(x.reshape(8, 8), cmap='gray')
plt.title(f'True: {y_true}, Predicted: {y_pred}')
plt.axis('off')
plt.show()
在这个示例中,我们随机选择一个测试样本,并使用predict()方法预测结果。然后我们使用matplotlib库将测试样本和预测结果可视化。
总结
以上是Python利用三层神经网络实现手写数字分类的攻略。神经网络是一种模拟人脑神经元工作方式的计算模型,它可以用于分类、回归等任务。本攻略中,我们介绍了神经网络的原理和实现方法,并提供两个示例来演示如何使用Python实现手写数字分类。这些示例代码可以帮助读者更好地理神经网络的方法和应用场景。