一.前情提要
1.本文是代码结合知识点,注释即为知识点
2.主要详细讲解MNIST代码以及基础知识
3.若想深入学习,建议阅读
附数据集|基于Pytorch框架的【Minst手写数字识别】项目!机器学习新手必备的原理详解+项目实战_哔哩哔哩_bilibili
4.手机上阅读体验不佳,建议电脑阅读!!!
二.简单介绍
MNIST(Modified National Institute of Standards and Technology)是一个经典的手写数字数据集,通常用于机器学习和深度学习的入门练习。它由来自美国国家标准与技术研究所(NIST)的来自 250 个不同人手写的数字构成,其中 60,000 个样本用作训练集,10,000 个样本用作测试集。
MNIST数据集的每个样本都是28x28像素的灰度图像,代表着0到9中的一个数字。这些图像经过了预处理,其中心对齐并缩放到相同的大小。因此,每个图像都可以表示为一个784维的向量(28x28=784),其中每个元素代表像素的亮度值。
由于其简单易用且具有代表性,MNIST数据集成为了机器学习领域的基准测试数据之一,用于评估新算法的性能。许多深度学习框架和算法都会使用MNIST数据集进行示例演示和性能测试。
三.代码学习
import tensorflow as tf
# 加载MNIST数据集
mnist = tf.keras.datasets.mnist
# 加载并分割为训练集和测试集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 数据预处理:将像素值缩放到0到1之间
train_images = train_images / 255.0
test_images = test_images / 255.0
# 构建神经网络模型
model = tf.keras.Sequential([
# 将28x28的图像展平为一维向量
tf.keras.layers.Flatten(input_shape=(28, 28)),
# 添加一个具有128个神经元的全连接隐藏层,使用ReLU激活函数
tf.keras.layers.Dense(128, activation='relu'),
# 添加一个具有10个神经元的输出层,使用softmax激活函数,用于分类
tf.keras.layers.Dense(10, activation='softmax')
])
# 编译模型,指定优化器、损失函数和评估指标
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(train_images, train_labels, epochs=5)
# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('\nTest accuracy:', test_acc)
这段代码首先加载MNIST数据集,然后进行了数据预处理,包括将像素值缩放到0到1之间。接着构建了一个简单的神经网络模型,包括一个Flatten层用于将图像展平,一个具有128个神经元的隐藏层和一个具有10个神经元的输出层。模型使用adam优化器和交叉熵损失函数进行编译,并使用训练数据进行了5个epoch的训练。最后,使用测试数据评估了模型的性能
四.优化代码
①可以通过以下几种方式:
调整神经网络架构:
- 增加更多的隐藏层或神经元数量可以提高模型的表示能力,但要注意过拟合的问题。
- 尝试不同的激活函数,如 Leaky ReLU、ELU 等,以提高模型的性能。
- 添加正则化项,如 L1 正则化、L2 正则化等,以减少过拟合的风险。
调整训练参数:
- 调整训练的 epoch 数量,可以通过早停法来避免过拟合。
- 尝试不同的批量大小,以平衡训练速度和模型性能。
尝试不同的优化器和学习率调度:
- 使用不同的优化器,如 SGD、Adam、RMSprop 等,以寻找最佳的收敛速度和性能。
- 考虑使用学习率调度器,如学习率衰减或动态调整学习率,以优化模型的训练过程。
数据增强:
- 对训练数据进行增强,如随机旋转、平移、缩放等,以扩充训练数据集,提高模型的泛化能力。
模型集成:
- 尝试使用集成学习方法,如投票、Bagging、Boosting 等,以提高模型的性能和稳定性。
②示例代码
import tensorflow as tf
from tensorflow.keras import layers
# 加载MNIST数据集
mnist = tf.keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 数据预处理
train_images = train_images / 255.0
test_images = test_images / 255.0
# 构建神经网络模型
model = tf.keras.Sequential([
layers.Flatten(input_shape=(28, 28)),
layers.Dense(128, activation='relu'),
layers.Dropout(0.2), # 添加 Dropout 层以减少过拟合
layers.Dense(64, activation='relu'), # 添加额外的隐藏层
layers.Dropout(0.2), # 添加 Dropout 层以减少过拟合
layers.Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
history = model.fit(train_images, train_labels, epochs=10, validation_split=0.2)
# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('\nTest accuracy:', test_acc)
五.最后提示
1.本作仅作初步学习,深入且成体系还是需要上述视频