MNIST 数据集是机器学习领域非常经典的一个图像数据集,它包含了 60000 张训练图像和 10000 张测试图像,这些图像都是手写数字(0 - 9)的灰度图像,图像大小为 28×28 像素。每一张图像对应一个数字标签,表示图像中手写数字的真实值。

示例代码:

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

# 加载MNIST数据集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

# 对数据进行归一化,将像素值从0-255范围归一化到0-1范围,这有助于模型训练
train_images = train_images / 255.0
test_images = test_images / 255.0

# 增加一个维度,用于适配卷积神经网络输入要求(原本是 (60000, 28, 28),变为 (60000, 28, 28, 1))
train_images = train_images[..., tf.newaxis]
test_images = test_images[..., tf.newaxis]

# 构建卷积神经网络模型
model = models.Sequential()
# 第一个卷积层,32个卷积核,卷积核大小为3x3,激活函数使用ReLU,输入形状为 (28, 28, 1)
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
# 第二个卷积层,64个卷积核,3x3卷积核,激活函数ReLU
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
# 第三个卷积层,64个卷积核,3x3卷积核,激活函数ReLU
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

# 将卷积层输出展平,以便连接全连接层
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))  # 输出层,10个神经元对应10个数字类别

# 编译模型,指定优化器、损失函数和评估指标
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_typing='logits'),
              metrics=['accuracy'])

# 训练模型,指定训练轮数、批量大小等参数
history = model.fit(train_images, train_labels, epochs=5, batch_size=64,
                    validation_data=(test_images, test_labels))

# 绘制训练过程中的准确率和损失曲线
plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
plt.xlabel('轮数')
plt.ylabel('值')
plt.title('MNIST数据集上卷积神经网络训练结果')
plt.legend()
plt.show()

# 在测试集上评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'在测试集上的损失: {test_loss}')
print(f'在测试集上的准确率: {test_acc}')

数据准备阶段

首先通过 datasets.mnist.load_data() 函数加载 MNIST 数据集,得到训练集和测试集的图像数据以及对应的标签数据。

接着对图像数据进行归一化处理,将像素值从 0 - 255 的范围归一化到 0 - 1 的范围,这样有助于提高模型训练的效率和稳定性。并且为了适配卷积神经网络对输入数据维度的要求(卷积神经网络一般要求输入数据的维度格式为 (样本数量, 高度, 宽度, 通道数)),给图像数据增加了一个表示通道数的维度(MNIST 是灰度图像,通道数为 1)。

模型构建阶段

使用 Sequential 方式来顺序构建卷积神经网络模型。

先是添加了三个卷积层(Conv2D),在每个卷积层中指定了卷积核的数量、大小以及激活函数(这里使用 ReLU 激活函数)。卷积层可以自动提取图像中的特征,随着层数的增加,提取的特征越来越抽象和高级。每个卷积层后面跟着一个最大池化层(MaxPooling2D),它的作用是对特征图进行下采样,减少数据维度的同时保留重要的特征信息,有助于防止过拟合并且提高计算效率。

然后通过 Flatten 层将卷积层输出的多维特征图展平为一维向量,以便能够连接后面的全连接层。接着添加了两个全连接层(Dense),第一个全连接层有 64 个神经元,使用 ReLU 激活函数,最后一个全连接层有 10 个神经元,对应着 10 个数字类别(输出层),这里没有指定激活函数,因为在编译模型时会结合损失函数来处理多分类的概率输出。

模型编译阶段

使用 compile 方法来编译模型,指定了优化器为 adam(一种常用的自适应学习率优化器),损失函数选用 SparseCategoricalCrossentropy(适用于多分类任务且标签为整数形式的情况),同时指定了评估指标为 accuracy(准确率),用于在训练过程中监控模型的性能。

模型训练阶段

通过 fit 方法来训练模型,传入训练集的图像数据和标签数据,同时指定了训练的轮数(epochs)为 5,表示整个训练数据集将被迭代训练 5 次,以及每批数据的大小(batch_size)为 64(即将训练数据分成若干个大小为 64 的批次来进行训练)。还传入了验证集数据(测试图像和测试标签),这样在训练过程中可以同时观察模型在验证集上的性能表现,以便及时发现过拟合等问题。

结果可视化与评估阶段

利用 matplotlib 库绘制了训练过程中训练集和验证集的准确率、损失随训练轮数变化的曲线,通过观察这些曲线可以直观地了解模型的训练情况,例如是否收敛、是否存在过拟合等问题。

最后使用 evaluate 方法在测试集上对训练好的模型进行评估,得到测试集上的损失值和准确率,以此来衡量模型在未见过的数据(测试集)上的分类性能,了解模型对手写数字图像分类的准确程度。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐