返回

手把手教你用Python轻松玩转MNIST手写数字识别

后端

从零开始构建深度前馈神经网络以识别手写数字图像

前言

厌倦了枯燥乏味的理论?想亲手构建深度学习模型吗?这篇博客将带你从零开始,用 Python 构建一个三层深度前馈网络,识别手写数字图像。

数据预处理

首先,我们需要预处理 MNIST 数据集,其中包含 70,000 张手写数字图像。我们将加载图像,将其转换为张量,并将它们归一化到 [0, 1] 范围内。

import numpy as np
from PIL import Image

# 加载图像
images = [Image.open(f"mnist_data/{i}.png") for i in range(70000)]

# 转换为张量并归一化
images = np.array([np.array(image) / 255 for image in images])

网络模型构建

接下来,构建三层深度前馈网络:输入层、隐藏层和输出层。

import tensorflow as tf

# 构建模型
model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

模型参数初始化

在训练之前,需要初始化权重和偏置等模型参数。

from tensorflow.keras.initializers import RandomNormal

# 初始化权重和偏置
model.build(input_shape=(None, 28, 28))
model.set_weights([RandomNormal()(weight.shape) for weight in model.weights])

正向推理

正向推理是将输入数据通过网络并得到输出值的过程。

# 正向推理
predictions = model.predict(images)

反向梯度下降参数寻优

反向梯度下降算法帮助我们找到最佳模型参数。

from tensorflow.keras.optimizers import Adam

# 定义优化器
optimizer = Adam(learning_rate=0.001)

# 编译模型
model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 训练模型
model.fit(images, labels, epochs=10)

模型预测

训练好模型后,我们就可以用来预测新的图像。

# 模型预测
new_image = np.array([np.array(Image.open("new_image.png")) / 255])
prediction = model.predict(new_image)

总结

恭喜你!你已经构建和训练了一个深度前馈网络,可以识别手写数字图像。你不仅学到了如何构建神经网络,还为自己的深度学习之旅打下了基础。

常见问题解答

1. 如何提高模型的准确性?
答:你可以通过增加训练数据量、调整超参数(如学习率和批量大小)或使用不同的神经网络架构来提高准确性。

2. 训练网络需要多长时间?
答:训练时间取决于数据量、模型复杂性和硬件性能。

3. 我可以在其他图像数据集上使用这个网络吗?
答:是的,你可以通过对图像进行适当的预处理来使用这个网络进行其他图像数据集的分类。

4. 如何保存和加载训练好的模型?
答:你可以使用 TensorFlow 的 save()load() 方法来保存和加载模型。

5. 如何进一步扩展这个项目?
答:你可以添加更多的层、尝试不同的激活函数、使用其他优化算法,或应用这个网络来解决其他问题,如图像生成或目标检测。