共计 2614 个字符,预计需要花费 7 分钟才能阅读完成。
背景介绍
CIFAR100 是深度学习领域广泛使用的基准数据集之一,由 60000 张 32×32 像素的彩色图片组成,包含 100 个精细分类(如 ” 苹果 ”、” 摩托车 ”)和 20 个粗分类(如 ” 水果 ”、” 车辆 ”)。每个类别有 500 张训练图片和 100 张测试图片。由于其适中的规模和丰富的类别,常被用于图像分类、迁移学习等任务的模型验证。

下载方法
官方渠道下载
- 访问官方网站(https://www.cs.toronto.edu/~kriz/cifar.html)
- 下载 ”CIFAR-100 python version” 压缩包(约 160MB)
-
解压后得到
train和test二进制文件 -
优点:原始数据来源,版本稳定
- 缺点:需手动解压和处理,无内置预处理
通过 TensorFlow Datasets(TFDS)下载
import tensorflow_datasets as tfds
ds = tfds.load('cifar100', split='train', shuffle_files=True)
- 优点:一行代码自动下载解压,内置标准化 / 切分功能
- 缺点:需额外安装库,网络不稳定时可能中断
通过 PyTorch 下载
import torchvision
trainset = torchvision.datasets.CIFAR100(root='./data', train=True, download=True)
- 优点:与 PyTorch 生态无缝集成
- 缺点:下载速度可能较慢
数据解析
二进制文件结构
原始 Python 版本的数据使用 pickle 序列化存储,结构为:
{'data': ndarray(50000x3072), # 每行 32x32x3=3072 个像素(RGB 通道连续)
'fine_labels': list[50000], # 0-99 的精细标签
'coarse_labels': list[50000] # 0-19 的粗标签
}
手动解析示例
import pickle
def unpickle(file):
with open(file, 'rb') as fo:
dict = pickle.load(fo, encoding='bytes')
return dict
train_data = unpickle('cifar-100-python/train')
# 转换数据形状为(N,H,W,C)
images = train_data[b'data'].reshape(-1, 3, 32, 32).transpose(0, 2, 3, 1)
完整代码示例
TensorFlow 实现
import tensorflow as tf
from tensorflow.keras import layers
# 数据增强预处理
def preprocess(image, label):
image = tf.image.random_flip_left_right(image)
image = tf.image.random_brightness(image, max_delta=0.2)
return image/255.0, label
# 创建数据管道
def make_tf_dataset(batch_size=64):
(train_ds, test_ds), info = tfds.load(
'cifar100',
split=['train', 'test'],
as_supervised=True,
with_info=True
)
train_ds = train_ds.map(preprocess).shuffle(1000).batch(batch_size)
test_ds = test_ds.map(lambda x,y: (x/255.0, y)).batch(batch_size)
return train_ds, test_ds, info
PyTorch 实现
import torch
from torchvision import transforms
# 定义增强变换
train_transform = transforms.Compose([transforms.RandomHorizontalFlip(),
transforms.RandomRotation(15),
transforms.ToTensor(),
transforms.Normalize(mean=[0.507, 0.487, 0.441], std=[0.267, 0.256, 0.276])
])
test_transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize(mean=[0.507, 0.487, 0.441], std=[0.267, 0.256, 0.276])
])
# 创建数据集
trainset = torchvision.datasets.CIFAR100(
root='./data',
train=True,
download=True,
transform=train_transform
)
trainloader = torch.utils.data.DataLoader(
trainset,
batch_size=64,
shuffle=True,
num_workers=2
)
性能优化技巧
- 内存映射 :对于大型数据集,使用
np.memmap避免全量加载 - 并行加载 :设置
num_workers>0(PyTorch) 或prefetch(TensorFlow) - 在线增强:在 GPU 处理批次时异步执行 CPU 端的预处理
- 格式转换:提前将数据转为 TFRecord 或 HDF5 加速 IO
常见问题解决
- 下载中断 :检查
~/.keras/datasets/或./data目录是否有残留文件 - 标签混乱 :注意官方版本使用
b'fine_labels'的 bytes 格式 - 内存不足:尝试减小批次大小或使用生成器逐步加载
- 版本冲突 :确保
pickle与 Python 版本兼容,可指定encoding='bytes'
延伸实践
- 尝试添加 MixUp 或 CutMix 等高级增强策略
- 探索 CIFAR100 的子集划分(如只使用 20 个粗类别)
- 对比 CIFAR10、TinyImageNet 等类似数据集
- 实现自定义的数据缓存机制加速多次实验
结语
通过本文的实践指南,你应该已经掌握了 CIFAR100 数据集的完整处理流程。建议从官方下载开始理解原始数据格式,再过渡到框架内置方法提高效率。在实际项目中,合理的数据预处理往往比模型结构更能影响最终性能,因此值得投入时间优化数据管道。
正文完
