返回

Keras 深度学习:使用 CNN 模型识别 MNIST 手写数字

人工智能

引言

在探索了卷积神经网络 (CNN) 的基础知识后,我们现在着手构建一个 CNN 模型,以解决一个实际问题:识别 MNIST 手写数字数据集中的图像。这种实践不仅有助于加深我们对 CNN 原理的理解,而且还为我们提供了解决现实世界任务的强大工具。

构建 CNN 模型

我们的 CNN 模型将包括以下层:

  • 卷积层 (Conv2D): 提取图像中的特征。
  • 池化层 (MaxPooling2D): 减少特征图的大小,提高模型的鲁棒性。
  • 全连接层 (Dense): 对特征进行分类,输出预测。

训练模型

我们使用 Keras 的 Sequential API 构建模型并使用 ImageDataGenerator 准备我们的数据。训练过程包括:

  1. 加载和预处理数据: 加载 MNIST 数据集并将其转换为适用于 CNN 的格式。
  2. 构建模型: 创建上面的 CNN 模型。
  3. 编译模型: 指定损失函数、优化器和指标。
  4. 训练模型: 使用训练数据迭代训练模型。

评估模型

在训练后,我们评估模型的性能:

  • 准确率: 模型正确分类图像的百分比。
  • 损失值: 模型预测与真实标签之间的平均误差。

代码示例

以下代码段展示了如何使用 Keras 构建和训练 CNN 模型以识别 MNIST 手写数字:

import keras
from keras import layers
from keras.datasets import mnist

# 加载 MNIST 数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 预处理数据
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

# 构建 CNN 模型
model = keras.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

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

# 训练模型
model.fit(x_train, y_train, epochs=10)

# 评估模型
loss, accuracy = model.evaluate(x_test, y_test)
print('Loss: ', loss)
print('Accuracy: ', accuracy)

结论

通过构建 CNN 模型识别 MNIST 手写数字,我们展示了 CNN 的强大功能。通过实践和深入理解,我们可以运用 CNN 解决广泛的图像识别和处理任务。