深度学习入门实战:从原理到 MNIST 手写数字识别
介绍深度学习基本概念,包括神经网络、激活函数及损失函数。通过 TensorFlow 框架实现 MNIST 手写数字识别 Demo,涵盖数据加载、预处理、模型构建、训练与预测全流程。旨在帮助初学者理解深度学习的核心逻辑与实践步骤。

介绍深度学习基本概念,包括神经网络、激活函数及损失函数。通过 TensorFlow 框架实现 MNIST 手写数字识别 Demo,涵盖数据加载、预处理、模型构建、训练与预测全流程。旨在帮助初学者理解深度学习的核心逻辑与实践步骤。

神经网络 (Neural Networks) 神经网络是从信息处理角度对人脑神经元网络进行抽象而建立的运算模型。它由大量神经元相互连接构成,通过调整连接权重来学习数据中的规律。构建和训练神经网络是掌握深度学习的基础。
神经元 (Neuron) 神经元模型包含输入、输出与计算功能。它是神经网络的基本单元,接收多个输入信号,经过加权求和及激活函数处理后产生输出。
前向传播与反向传播 这是神经网络运行的两个核心阶段:
激活函数 (Activation Function) 激活函数决定神经元的输出是否被激发。常见的激活函数包括 Sigmoid、Tanh、ReLU 等。引入非线性激活函数使得神经网络能够拟合复杂的非线性关系。
损失函数 (Loss Function) 损失函数用于衡量模型预测值与实际目标值之间的差异。常见的有均方误差 (MSE)、交叉熵损失 (Cross Entropy) 等。优化过程即是最小化损失函数的过程。
优化算法 (Optimizer) 优化算法负责根据损失函数的梯度更新网络参数。常用的算法包括随机梯度下降法 (SGD)、Adam 等。选择合适的优化器能显著提升模型的收敛速度和效果。
目前业界主流的深度学习框架主要包括 TensorFlow 和 PyTorch:
对于初学者而言,建议优先选择 PyTorch 或 TensorFlow 的 Keras API,重点在于理解模型构建逻辑而非框架细节。
本章节将通过 TensorFlow 框架实现 MNIST 手写数字识别,完整演示从数据准备到模型预测的全过程。
开发环境
导入库与数据集 MNIST 数据集包含 60,000 张训练图片和 10,000 张测试图片,每张为 28x28 像素的灰度图。
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
import numpy as np
# 加载数据集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
# 查看数据形状
print(f"训练集形状:{train_images.shape}")
print(f"测试集形状:{test_images.shape}")
原始数据需要转换为浮点数并归一化,以便加速模型收敛。同时需增加通道维度以满足 CNN 输入要求。
# 数据类型转换与归一化
train_images = train_images.astype('float32') / 255.0
test_images = test_images.astype('float32') / 255.0
# 调整维度:(样本数,高,宽,通道)
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))
print(f"调整后训练集形状:{train_images.shape}")
可视化部分数据 通过 Matplotlib 展示部分训练样本,确认数据读取正确。
plt.figure(figsize=(10, 4))
for i in range(10):
plt.subplot(2, 5, i+1)
plt.imshow(train_images[i], cmap='gray')
plt.title(f"Label: {train_labels[i]}")
plt.axis('off')
plt.show()
我们构建一个典型的卷积神经网络 (CNN)。相比全连接网络,CNN 能更好地提取空间特征。
模型结构说明
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dropout(0.5), # 防止过拟合
layers.Dense(10, activation='softmax')
])
# 打印模型摘要
model.summary()
编译配置
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
训练过程 设置训练轮数 (epochs) 和批次大小 (batch_size)。使用验证集监控模型泛化能力。
history = model.fit(
train_images, train_labels,
epochs=5,
batch_size=64,
validation_split=0.1,
verbose=1
)
评估性能 在测试集上评估模型的准确率和损失。
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)
print(f'测试集准确率:{test_acc:.4f}')
单张图片预测 选取一张测试图片进行预测,并可视化其概率分布。
# 获取预测概率
predictions = model.predict(test_images)
# 获取预测类别索引
predicted_label = np.argmax(predictions[0])
true_label = test_labels[0]
print(f"真实标签:{true_label}, 预测标签:{predicted_label}")
# 可视化第一张测试图片
plt.imshow(test_images[0], cmap='gray')
plt.title(f"Predicted: {predicted_label}")
plt.axis('off')
plt.show()
在实际训练中,可能会遇到以下情况:
本文系统介绍了深度学习的基础理论,包括神经网络结构、核心组件及经典模型。通过 TensorFlow 实战案例,详细展示了 MNIST 手写数字识别的完整流程,涵盖数据预处理、模型构建、训练调优及评估预测。
掌握这一流程后,可进一步探索更复杂的计算机视觉任务(如物体检测、语义分割)或自然语言处理任务。建议读者在此基础上尝试修改网络结构、更换数据集,以深入理解深度学习的工作机制。
扩展阅读建议

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online