卷积神经网络实现手写识别
时间: 2025-01-02 21:29:13 浏览: 18
### 使用卷积神经网络(CNN) 实现手写数字识别
#### CNN模型构建与训练过程概述
卷积神经网络(CNN)特别适用于处理二维结构化数据,如图像。对于手写数字识别任务而言,MNIST 数据集被广泛应用作为基准测试集合[^1]。
#### 构建CNN模型
为了实现手写数字识别功能,可以采用TensorFlow框架下的Keras API来定义并编译一个简单的CNN架构:
```python
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))
# 将像素值标准化到 [0, 1] 范围内
train_images, test_images = train_images / 255.0, test_images / 255.0
model = models.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.Conv2D(64, (3, 3), activation='relu'))
model.summary() # 展示模型结构
```
此部分代码创建了一个具有三层卷积层的序列模型,并通过`MaxPooling2D`操作减少特征图尺寸以降低计算复杂度。
#### 添加全连接层完成分类器设计
为了让上述提取出来的高级特征能够用于最终预测类别,在最后一层卷积之后还需要加入若干密集层构成完整的分类器:
```python
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10)) # 输出节点数等于目标类别的数量
```
这里先展平三维张量成一维向量形式再接入两个线性变换层;最后一个Dense层不指定激活函数,默认使用线性激活,因为后续会应用softmax转换概率分布[^2]。
#### 编译与训练模型
配置好损失函数、优化算法以及评估指标后就可以开始正式训练了:
```python
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
history = model.fit(train_images, train_labels, epochs=5,
validation_data=(test_images, test_labels))
```
这段脚本指定了Adam为梯度下降方法,并选择了适合多分类场景下使用的交叉熵误差衡量标准。同时设置了验证集以便监控泛化性能变化趋势。
#### 测试模型准确性
经过多次迭代更新权重参数直至收敛稳定下来以后,可以通过下面的方式查看在独立样本上的表现情况:
```python
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'\nTest accuracy: {test_acc}')
```
这一步骤有助于了解所建立起来的手写字体辨识系统的实际效能水平。
阅读全文