返回
Keras 深度学习:使用 CNN 模型识别 MNIST 手写数字
人工智能
2023-10-03 22:56:31
引言
在探索了卷积神经网络 (CNN) 的基础知识后,我们现在着手构建一个 CNN 模型,以解决一个实际问题:识别 MNIST 手写数字数据集中的图像。这种实践不仅有助于加深我们对 CNN 原理的理解,而且还为我们提供了解决现实世界任务的强大工具。
构建 CNN 模型
我们的 CNN 模型将包括以下层:
- 卷积层 (Conv2D): 提取图像中的特征。
- 池化层 (MaxPooling2D): 减少特征图的大小,提高模型的鲁棒性。
- 全连接层 (Dense): 对特征进行分类,输出预测。
训练模型
我们使用 Keras 的 Sequential
API 构建模型并使用 ImageDataGenerator
准备我们的数据。训练过程包括:
- 加载和预处理数据: 加载 MNIST 数据集并将其转换为适用于 CNN 的格式。
- 构建模型: 创建上面的 CNN 模型。
- 编译模型: 指定损失函数、优化器和指标。
- 训练模型: 使用训练数据迭代训练模型。
评估模型
在训练后,我们评估模型的性能:
- 准确率: 模型正确分类图像的百分比。
- 损失值: 模型预测与真实标签之间的平均误差。
代码示例
以下代码段展示了如何使用 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 解决广泛的图像识别和处理任务。