【实战演练】图像分类项目:MNIST手写数字识别-数据预处理、CNN构建、模型训练与评估
发布时间: 2024-06-26 21:21:18 阅读量: 82 订阅数: 110
![【实战演练】图像分类项目:MNIST手写数字识别-数据预处理、CNN构建、模型训练与评估](https://img-blog.csdnimg.cn/459b25827bdf41b4a74af43724222069.png)
# 2.1 数据集介绍和加载
MNIST数据集是一个经典的图像分类数据集,包含70,000张手写数字图像,其中训练集有60,000张,测试集有10,000张。每张图像的大小为28x28像素,代表一个0到9之间的数字。
```python
import tensorflow as tf
# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
# 归一化图像数据
x_train, x_test = x_train / 255.0, x_test / 255.0
```
# 2. 数据预处理与探索性数据分析
### 2.1 数据集介绍和加载
MNIST 手写数字数据集包含 70,000 张手写数字图像,其中 60,000 张用于训练,10,000 张用于测试。每张图像大小为 28x28 像素,表示一个手写数字(0-9)。
```python
# 导入 MNIST 数据集
from keras.datasets import mnist
# 加载 MNIST 数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
```
### 2.2 数据探索和可视化
#### 数据分布分析
为了了解数据集的分布,我们可以绘制每个数字类别的数量分布图。
```python
import matplotlib.pyplot as plt
# 计算每个数字类别的数量
num_classes = 10
class_counts = [np.sum(y_train == i) for i in range(num_classes)]
# 绘制分布图
plt.bar(range(num_classes), class_counts)
plt.xlabel("数字类别")
plt.ylabel("数量")
plt.title("MNIST 手写数字数据集分布")
plt.show()
```
#### 数据可视化
为了直观地了解手写数字图像,我们可以可视化一些样本。
```python
# 随机选择 10 个样本
sample_idx = np.random.choice(range(len(x_train)), 10)
# 可视化样本
fig, axes = plt.subplots(2, 5, figsize=(10, 4))
for i, idx in enumerate(sample_idx):
ax = axes[i // 5, i % 5]
ax.imshow(x_train[idx], cmap="gray")
ax.set_title(y_train[idx])
ax.axis("off")
plt.tight_layout()
plt.show()
```
#### 数据归一化
为了使数据分布更加均匀,提高模型训练效率,需要对数据进行归一化。
```python
# 将图像像素值归一化到 0-1 之间
x_train = x_train.astype("float32") / 255
x_test = x_test.astype("float32") / 255
```
# 3.1 CNN的基本原理和架构
**卷积神经网络(CNN)**是一种深度学习模型,专门用于处理具有网格状结构的数据,例如图像。CNN的架构由一系列卷积层、池化层和全连接层组成。
**卷积层**是CNN的核心组件。它使用一个称为卷积核的小过滤器来扫描输入数据,提取特征。卷积核在输入数据上滑动,与每个局部区域进行点积运算,生成一个特征图。
**池化层**用于对卷积层的输出进行降采样,减少特征图的大小。池化操作可以是最大池化或平均池化,它通过将特征图中的相邻元素合并成一个元素来实现降采样。
**全连接层**位于CNN的末尾,用于将卷积层和池化层提取的特征转换为输出。全连接层将所有特征图中的元素连接成一个向量,并使用一个线性分类器对输入数据进行分类。
**CNN架构**通常遵循以下模式:
```
输入层 -> 卷积层 -> 池化层
```
0
0