1. 实验背景与数据集介绍
Fashion MNIST数据集是机器学习领域的经典基准测试集,它完美替代了传统的MNIST手写数字数据集。这个数据集包含了7万张28x28像素的灰度图像,涵盖10类时尚单品,每类各有7000张样本。训练集和测试集按照6:1的比例划分,正好符合机器学习中常见的训练测试集划分标准。
我第一次接触这个数据集时就发现它特别适合用来比较不同模型的性能。相比手写数字,服饰分类任务更具挑战性——不同类别的T恤、衬衫和外套在低分辨率下确实容易混淆。数据集中的类别包括T恤、裤子、套头衫、连衣裙、外套、凉鞋、衬衫、运动鞋、包和短靴,这些都是日常生活中常见的服饰品类。
加载数据集非常简单,使用Keras内置的API几行代码就能搞定:
from tensorflow import keras (train_images, train_labels), (test_images, test_labels) = keras.datasets.fashion_mnist.load_data()2. 数据预处理技巧
原始图像的像素值范围是0-255,我们需要先做归一化处理:
train_images = train_images / 255.0 test_images = test_images / 255.0可视化检查是必不可少的步骤。我习惯用matplotlib查看前25个样本,这能快速验证数据加载是否正确:
import matplotlib.pyplot as plt plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.imshow(train_images[i], cmap=plt.cm.binary) plt.xlabel(class_names[train_labels[i]])在实际项目中,我还会做数据增强(旋转、平移等),但本次实验为了公平比较模型性能,我们使用原始数据。不过要注意,如果图像尺寸不一致,所有模型都需要统一调整输入尺寸。
3. 词袋模型实现与优化
词袋模型(BoW)在图像识别中是个有趣的方法。我的实现步骤是:
- 提取所有图像的SIFT特征
- 用K-means聚类构建视觉词典
- 统计每张图像中视觉单词的出现频率
具体实现时,我发现有几点需要注意:
sift = cv2.xfeatures2d.SIFT_create() kp, des = sift.detectAndCompute(img, None)聚类中心数量的选择很关键,我通过实验发现取总特征数的1/40效果不错。最终用线性SVM分类,在测试集上达到62.9%的准确率。不过混淆矩阵显示,模型特别容易混淆T恤、衬衫和外套这三类。
4. HOG特征+SVM方案详解
HOG(方向梯度直方图)是更成熟的传统方法。我的实现流程:
- 计算每张图像的HOG特征
- 直接使用线性SVM分类
代码实现如下:
from skimage.feature import hog fd = hog(img, orientations=8, pixels_per_cell=(4,4))这个方案达到了79.9%的准确率,比词袋模型提升明显。但从分类报告看,衬衫类别的识别率仍然很低(recall仅16%),因为衬衫和其他上装确实很相似。
5. 多层感知机(MLP)实战
MLP是最基础的神经网络结构。我搭建了一个包含单隐藏层(256神经元)的网络:
model = Sequential([ Dense(256, activation='relu', input_shape=(784,)), Dense(10, activation='softmax') ])经过10个epoch训练,测试准确率达到87.2%。有意思的是,虽然整体准确率提升,但衬衫的识别问题依然存在。这说明简单的全连接网络难以捕捉空间特征。
6. CNN模型架构与调参
CNN是图像识别的利器。我实现了经典的LeNet-5结构:
model = Sequential([ Conv2D(6, (5,5), activation='relu'), MaxPooling2D(), Conv2D(16, (5,5), activation='relu'), MaxPooling2D(), Flatten(), Dense(120, activation='tanh'), Dense(84, activation='tanh'), Dense(10, activation='softmax') ])这个模型达到了89.2%的准确率,而且训练速度比MLP快很多。通过混淆矩阵分析,CNN在各类别上的表现更均衡,证明卷积操作确实能有效提取空间特征。
7. 多模型对比与结果分析
将四个模型的表现整理如下表:
| 模型类型 | 测试准确率 | 训练时间 | 参数量 |
|---|---|---|---|
| 词袋模型 | 62.9% | 较长 | 取决于词典大小 |
| HOG+SVM | 79.9% | 中等 | 特征维度相关 |
| MLP | 87.2% | 较长 | 20万+ |
| CNN | 89.2% | 较短 | 4.4万 |
从实战经验看,CNN在保持较高准确率的同时,参数量反而比MLP少很多,这得益于它的参数共享机制。对于服饰分类这种任务,我推荐优先考虑CNN架构。
8. 常见问题与解决方案
在实验过程中我遇到了几个典型问题:
内存不足:处理词袋模型时,大量SIFT特征会耗尽内存。我的解决方法是分批处理,或者使用更高效的特征提取方法。
类别不平衡:虽然Fashion MNIST本身是平衡的,但实际项目中常遇到这个问题。可以采用过采样或调整类别权重。
过拟合:特别是在MLP模型中,可以添加Dropout层:
model.add(Dropout(0.5))- 训练速度慢:使用GPU加速可以显著提升CNN的训练速度。在Colab上,CNN的训练时间能从几分钟缩短到几十秒。