共计 3616 个字符,预计需要花费 10 分钟才能阅读完成。
背景介绍
CIFAR100 是计算机视觉领域广泛使用的基准数据集,由 60000 张 32×32 像素的彩色图片组成,包含 100 个细粒度类别(如 ” 苹果 ”、” 摩托车 ”),这些类别又归属于 20 个超类(如 ” 水果 ”、” 车辆 ”)。每个类别有 600 张图像,其中 500 张训练图,100 张测试图。与 CIFAR10 相比,CIFAR100 的类别更细、分类难度更高,非常适合测试模型在细粒度识别任务上的表现。

这个数据集常用于:
- 图像分类模型基准测试
- 迁移学习研究
- 小样本学习实验
- 数据增强方法验证
下载方法对比
官方渠道下载
- 访问官网地址:https://www.cs.toronto.edu/~kriz/cifar.html
- 下载 ”CIFAR-100 python version” 压缩包(约 160MB)
- 解压后得到
cifar-100-python目录,包含: train:训练集test:测试集meta:类别元信息
优点:原始数据来源,版本可控
缺点:需要手动解压和处理文件
通过 TensorFlow Datasets(推荐)
import tensorflow_datasets as tfds
dataset, info = tfds.load('cifar100', split='train', with_info=True)
优点:
– 自动下载和解压
– 内置标准化拆分
– 直接返回 tf.data.Dataset 对象
缺点:
– 依赖库版本可能有兼容性问题
– 下载速度受网络环境影响
通过 PyTorch 内置工具
import torchvision
trainset = torchvision.datasets.CIFAR100(
root='./data',
train=True,
download=True
)
优点:
– 与 PyTorch 生态无缝集成
– 自动转换为 PIL 图像格式
数据解析详解
原始二进制文件结构(以 python 版本为例):
{'filenames': [bytes], # 文件名列表
'batch_label': bytes, # 批次标签
'fine_labels': [int], # 细粒度标签(0-99)
'coarse_labels': [int], # 超类标签(0-19)
'data': ndarray # 图像数据(N,3072)
}
关键点说明:
- 图像数据存储为 uint8 类型的 numpy 数组
- 每张图像的 3072 个像素按 RGB 通道顺序平铺(前 1024= 红,中 1024= 绿,后 1024= 蓝)
- 需要 reshape 为 32x32x3 格式才能正常显示
完整代码示例
TensorFlow 实现
import tensorflow as tf
import matplotlib.pyplot as plt
def load_cifar100_tf():
"""使用 TFDS 加载并预处理 CIFAR100"""
# 加载数据集
(train_ds, test_ds), info = tfds.load(
'cifar100',
split=['train', 'test'],
as_supervised=True,
with_info=True
)
# 定义预处理函数
def preprocess(image, label):
image = tf.cast(image, tf.float32) / 255.0
return image, label
# 应用预处理并配置性能优化
train_ds = train_ds.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)
train_ds = train_ds.shuffle(1024).batch(64).prefetch(tf.data.AUTOTUNE)
test_ds = test_ds.map(preprocess).batch(64)
return train_ds, test_ds, info
# 可视化样本
def show_samples(dataset):
plt.figure(figsize=(10,10))
for i, (image, label) in enumerate(dataset.take(9)):
plt.subplot(3,3,i+1)
plt.imshow(image.numpy())
plt.title(info.features['label'].int2str(label))
plt.axis('off')
plt.show()
# 使用示例
train_ds, test_ds, info = load_cifar100_tf()
show_samples(train_ds)
PyTorch 实现
import torch
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
def load_cifar100_pytorch():
"""使用 PyTorch 加载 CIFAR100"""
# 定义数据增强
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize(mean=[0.5071, 0.4867, 0.4408],
std=[0.2675, 0.2565, 0.2761]
)
])
# 加载数据集
trainset = datasets.CIFAR100(
root='./data',
train=True,
download=True,
transform=transform
)
testset = datasets.CIFAR100(
root='./data',
train=False,
download=True,
transform=transform
)
# 创建数据加载器
trainloader = torch.utils.data.DataLoader(
trainset,
batch_size=64,
shuffle=True,
num_workers=2
)
testloader = torch.utils.data.DataLoader(
testset,
batch_size=64,
shuffle=False,
num_workers=2
)
return trainloader, testloader
# 可视化函数
def imshow(img):
img = img / 2 + 0.5 # 反归一化
plt.imshow(img.permute(1, 2, 0))
plt.axis('off')
# 使用示例
trainloader, _ = load_cifar100_pytorch()
dataiter = iter(trainloader)
images, labels = next(dataiter)
plt.figure(figsize=(8,8))
for i in range(9):
plt.subplot(3,3,i+1)
imshow(images[i])
plt.show()
性能优化技巧
- 并行加载 :在数据加载器中使用
num_workers参数(PyTorch)或num_parallel_calls(TF) - 预取机制 :TF 的
prefetch和 PyTorch 的persistent_workers可以重叠数据加载与模型计算 - 内存映射 :对于大 batch size,可以使用
tf.data.Dataset.cache()将数据缓存到内存或磁盘 - 批处理优化:
- 调整
batch_size平衡内存使用和并行效率 - 使用
drop_last避免最后一个小 batch 的影响
常见问题解决方案
- 下载中断:
- 解决方案:手动下载后放到
~/tensorflow_datasets/downloads或torchvision.datasets指定的目录 -
校验文件完整性:python 版本 MD5 应为
a3bcedbac7cd1aeb0c6c52b3b39d264b -
内存不足:
- 使用生成器而非一次性加载全部数据
-
减小 batch size 或使用梯度累积
-
标签混淆:
- 注意区分
fine_labels(100 类)和coarse_labels(20 超类) -
使用
info.features['label'].int2str()(TF)或trainset.classes(PyTorch)查看类别名称 -
版本兼容性:
- TensorFlow 2.x 推荐使用 TFDS 而非直接解析二进制文件
- PyTorch 版本需与 torchvision 匹配
延伸实践建议
- 自定义数据增强:
- 尝试添加 CutMix、MixUp 等现代增强方法
-
使用 albumentations 库进行高效增强
-
探索类似数据集:
- CIFAR10:更简单的 10 分类任务
- Tiny ImageNet:200 类更大规模数据
-
Food-101:真实世界的食物分类数据集
-
迁移学习实验:
- 在 CIFAR100 上微调 ResNet、EfficientNet 等预训练模型
- 对比不同网络结构的性能差异
通过本指南,你应该已经掌握了 CIFAR100 数据集从下载到预处理的全流程。建议动手实践代码示例,并尝试修改参数观察不同效果,这是掌握深度学习数据处理的最佳方式。
