CIFAR-10 这个数据集,搞过计算机视觉或者图像分类的同学应该都不陌生。它由 Alex Krizhevsky、Vinod Nair 和 Geoffrey Hinton 等人整理发布,包含 60000 张 32×32 的彩色图片,均匀分布在 10 个类别里,几乎算是图像识别领域的“入门必修课”。只要是做深度学习,尤其是图像分类方向的,基本都会在模型演练阶段跟它打交道。而实际训练环境里,Ubuntu 又是最常见的操作系统,PyTorch、TensorFlow 的很多官方教程也默认在 Linux 环境下演示。
所以“Ubuntu 如何下载 CIFAR-10”这个问题,看起来简单,真正操作起来其实藏着不少细节。比如,用 wget 直接拉取官网地址,可能因为网络波动卡住;用 torchvision 自动下载,也可能因为证书、缓存或者权限问题报错;下载完之后,还会遇到解压失败、MD5 校验不一致、pickle 读取格式搞错等一系列小坑。这篇文章就把我在 Ubuntu 上下载和使用 CIFAR-10 的几种常规方案,以及踩过的坑,系统整理一遍。适合刚入门深度学习、想在 Ubuntu 服务器或者本机上快速把数据集跑通的同学参考。
1. CIFAR-10 数据集是什么,为什么非在 Ubuntu 上折腾
1.1 先搞清楚你下载的到底是什么
CIFAR-10 的全称是 Canadian Institute For Advanced Research 发布的 10 类图像数据集,里面的图片全是 32×32 像素的彩色图,每张图是一个 32×32×3 的 RGB 数组。整个数据集包含 60000 张图片,其中 50000 张是训练集,10000 张是测试集。10 个类别分别是飞机、汽车、鸟、猫、鹿、狗、青蛙、马、轮船和卡车,每个类别恰好 6000 张图,类别之间完全均衡,不需要做任何额外采样就能直接用于分类训练。
正因为图片分辨率低、总数量适中,CIFAR-10 在深度学习领域的位置非常特殊。它比 MNIST 这种单通道手写数字复杂得多,但又不至于像 ImageNet 那样动辄上百 GB、对硬件要求极高。对新手来说,跑通 LeNet、ResNet 这类经典模型的分类任务,CIFAR-10 是性价比最高的实验场。在实际工程里,很多团队也会先在这个数据集上做算法验证,确认模型结构没问题后再迁移到更复杂的数据集上。
下载方面,官方提供的主要是 Python 版本和 binary 版本,绝大多数场景下我们用 Python 版本就够了,也就是 cifar-10-python.tar.gz。这个压缩包大约 163MB,解压后会有 300MB 左右的目录,因为我长期在 Ubuntu 上做训练,所以对这套文件结构已经很熟悉了。你下载的本质上就是三样东西:训练集、测试集、类别标签说明。
1.2 为什么选择 Ubuntu 来做下载和训练环境
很多初学者一上来会在 Windows 上下载 CIFAR-10,然后拷贝到 Linux 服务器上。这么做不是不行,但在 Ubuntu 上直接下载会顺很多。第一,Linux 命令行的 wget、curl 是原生工具,一条命令搞定,不需要开浏览器、不需要找下载文件夹;第二,深度学习训练任务的主流部署环境就是 Ubuntu,下载后马上能接着做解压、加载和训练,环境切换成本最低;第三,后面如果用 GPU 训练,Ubuntu 下装 NVIDIA 驱动和 CUDA 的流程比 Windows 省心不少,踩坑概率低。
我个人的建议是,在你的 Ubuntu 机器上专门建一个 datasets 目录,把训练相关的数据统一放在里面。这样不管是 CIFAR-10、CIFAR-100 还是以后下载的其他数据集,都能做到归口管理,写代码时路径固定,不容易搞混。这一点看起来不起眼,但等到你同时维护多个项目、多个数据集的时候,就会发现规范目录结构带来的好处是巨大的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 下载 CIFAR-10 之前的准备工作
2.1 确认系统环境和磁盘空间
在动手下载之前,建议先确认一下 Ubuntu 的基本情况。用以下命令查看当前系统版本:
bash复制lsb_release -a
# 或者
cat /etc/os-release
理论上 CIFAR-10 的官方下载地址不挑系统版本,Ubuntu 18.04、20.04、22.04 甚至更新的版本都能正常下载,只需要保证系统里有 wget、curl 这类基础工具就行。如果发现系统没有安装,可以执行:
bash复制sudo apt update
sudo apt install -y wget curl ca-certificates
这里装 ca-certificates 的优先级很高,很多 Python 脚本自动下载时出现 SSL 证书报错,就是因为系统证书不完整。别小看这一步,它能帮你绕开不少后续的奇怪问题。
接着检查磁盘空间:
bash复制df -h
CIFAR-10 压缩包 163MB,解压后差不多 300MB。建议你所在磁盘剩余空间不低于 1GB,因为后续还可能需要转换格式、生成额外文件。尤其是有些同学喜欢把数据集放在根目录的 /opt 下,如果磁盘分区只给根目录留了几十个 GB,后面会非常被动。我习惯在 df -h 之后顺带看一眼收入说明,确认目标目录所在的挂载点空间充裕。
2.2 弄懂官方下载地址和文件校验值
CIFAR-10 官方下载地址是:
text复制https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
很多框架的自动下载脚本底层就是请求这个地址。源站在多伦多大学,某些网络环境下访问会比较慢,属于正常现象,不用慌。官方也给出了这个文件的 MD5 值,方便用户校验完整性。cifar-10-python.tar.gz 对应的 MD5 是:
text复制c58f30108f718f92721af3b95e74349a
这个 MD5 值我建议你保存在某处,下载完务必校验一次。它不仅能验证文件是否传输完整,还能判断你拿到的到底是不是官方原版文件。业界有不少团队习惯把公共数据集同步到公司内网或者对象存储里,如果文件被二次压缩过,MD5 对不上,解压或加载时很容易出现诡异报错。MD5 是发现问题的最快捷方式。
3. 五种主流下载方式实操解析
3.1 wget 命令行直接下载,最常规也最稳的方案
在 Ubuntu 终端里,最简单的下载方式就是 wget。先建好目录再进入目录:
bash复制mkdir -p ~/datasets/cifar10
cd ~/datasets/cifar10
wget https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
如果你所在的网络环境不太稳定,建议加上断点续传参数 -c,这样下载中断后再执行一次同样的命令,wget 会从上一次断开的位置继续拉取,而不是从头开始:
bash复制wget -c https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
实际操作中,我遇到过下载进度到 78% 时突然断网的情况,网络恢复后重新执行 wget -c,十几秒就补完了剩余部分。如果下载速度长期为 0,先别急着反复重试,可以加一个超时参数试试:
bash复制wget -c --timeout=30 --tries=0 https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
--timeout=30 表示如果 30 秒没有数据就报警,--tries=0 表示无限重试。这个组合适合放在后台继续下载,不用人盯着。
3.2 curl 方式下载,适合已经习惯 curl 的人
curl 和 wget 在功能上有很多重叠,如果你的服务器上 curl 更顺手,也可以用它:
bash复制curl -O https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
这里的 -O 表示按照服务器返回的文件名保存。如果下载过程中遇到重定向,需要加上 -L 参数:
bash复制curl -L -o cifar-10-python.tar.gz https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
我自己的习惯是 wget 为主,curl 主要用于调试接口、测试 URL 连通性。两者没有本质差别,选一个你用得顺手的即可。有一点要注意,curl -O 保存的文件名完全取决于服务器端返回的 Content-Disposition 头,如果文件名和你预期不一致,最好显式用 -o 指定。
3.3 用 torchvision 自动下载,PyTorch 用户的最爱
如果你打算直接用 PyTorch 做训练,其实不需要手工下载和解压。torchvision 内置了 CIFAR-10 数据集类,可以自动完成下载、解压、缓存的全过程。前提是你已经装好了 torch 和 torchvision:
bash复制pip install torch torchvision
然后写一个极简 Python 脚本:
python复制import torchvision
from torchvision import datasets
train_set = datasets.CIFAR10(root='./data', train=True, download=True)
test_set = datasets.CIFAR10(root='./data', train=False, download=True)
这个方案最省事的地方在于,你不用关心官方压缩包的结构,torchvision 自动下载后会在 ./data 目录下创建 cifar-10-batches-py 文件夹,并且自动完成解压。后续你用 DataLoader 加载数据时,只需要把 train_set 传进去就行。
如果你想手工控制下载过程,也有个变通办法:手动下载官方 tar.gz 文件,然后放到 root 目录下,不要解压,torchvision 发现文件已存在之后会跳过下载步骤,直接进入解压和读取。这个技巧在批量部署多台机器时很有用,不用每台机器都从外网拉一遍。
3.4 用 TensorFlow / Keras 自动下载
TensorFlow 同样内置了 CIFAR-10,代码更简洁:
python复制import tensorflow as tf
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
它会自动把压缩包下载到 ~/.keras/datasets/ 目录下,并且缓存起来,下次调用 load_data 时直接用本地缓存,不再重复下载。如果你之前只是想把数据下载下来,但没打算立刻用 TensorFlow,也可以单独执行下面这段脚本:
python复制from tensorflow.keras.datasets import cifar10
cifar10.load_data()
它干的事情就是下载 + 解压 + 加载到内存,看一眼缓存目录里的文件是否变得完整,你会对数据在磁盘上的存在形式更心里有数。TensorFlow 和 torchvision 的缓存目录不一致,这一点要留意,不然容易出现“明明下过了,换个框架又下一次”的情况。
3.5 低带宽环境下的替代下载思路
如果官方源在你的网络环境下特别慢,不必死磕一条路。第一种方法是找高校或者开源组织维护的镜像站,很多公共数据集会被镜像同步,地址多半是 mirrors.xxx.edu.cn 或者 mirrors.xxx.com 形式,在浏览器里直接访问镜像站点,搜索 CIFAR-10,通常能找到缓存文件。第二种方法是让身处在更好网络环境里的同事或者朋友下载好压缩包,再通过本地文件传输工具发给你,这种方式虽然原始,但最可靠。第三种是使用网盘分享的公共数据集资源,但有一个红线必须守住,就是下载完一定要用官方 MD5 校验,防止文件被篡改或者解压异常。
在我参与过的多个项目里,团队内部通常会有一个人负责把常用数据集收集整理好,放到共享存储或对象存储里,其他人直接拉取即可。这种“一份数据,多处复用”的方式,不只是省流量,更重要的是能保证所有人拿到的数据集版本一致,报告出来的训练指标才有可比性。
4. 下载完成后:校验、解压、读取一步到位
4.1 MD5 校验文件完整性
不管用哪种方式拿到压缩包,拿到手第一件事就是校验:
bash复制md5sum cifar-10-python.tar.gz
期望输出结果为:
text复制c58f30108f718f92721af3b95e74349a
如果输出一致,说明文件完整,可以继续。如果不一致,千万别接着往下走。网络传输导致文件损坏是常见现象,重新下载或者换一种方式下载即可。还有一种情况是压缩包尺寸是对的,但内容确实被改过,MD5 能帮你直接识别出来。训练数据不一致会导致实验结果无法对比,这是团队协作里的大忌。
4.2 解压 CIFAR-10 并理解内部文件结构
解压命令:
bash复制tar -zxf cifar-10-python.tar.gz
解压后会生成一个名为 cifar-10-batches-py 的目录,里面的结构如下:
- data_batch_1 到 data_batch_5:训练集被拆成 5 个文件,每个文件包含 10000 张图片及其标签,合计 50000 张。
- test_batch:测试集,包含 10000 张图片及其标签。
- batches.meta:元信息,主要记录类别名称。
- readme.html:官方说明文档,平时基本用不到。
我见过不少初学者以为 data_batch_1 就是完整训练集,直接用 10000 张图去训练模型,结果效果远低于预期。这里一定要记住,完整训练集必须把 5 个 batch 文件全部读完再拼接起来。每个 batch 文件的内部结构完全一致,本质上都是 Python pickle 序列化出来的字典对象。
4.3 用 Python 读出图片和标签
官方 Python 版本里的数据是用 pickle 保存的,读取时需要用到 pickle 库。示例代码如下:
python复制import pickle
import numpy as np
def unpickle(file):
with open(file, 'rb') as fo:
data = pickle.load(fo, encoding='bytes')
return data
batch1 = unpickle('cifar-10-batches-py/data_batch_1')
print(batch1.keys())
运行后会输出类似这样的结果:
text复制dict_keys([b'batch_label', b'labels', b'data', b'filenames'])
其中 data 是一个形状为 (10000, 3072) 的 numpy 数组,每一行是一张图片的像素值,3072 等于 32×32×3。labels 是一个长度为 10000 的列表,元素是对应图片的类别编号(0 到 9)。
把一维数组还原成图片时,需要按照通道顺序 reshape。CIFAR-10 的官方存储顺序是 3072 = 1024 个红色通道值 + 1024 个绿色通道值 + 1024 个蓝色通道值,所以直接 reshape 成 (3, 32, 32) 是不够的,还要转成 (32, 32, 3) 这种通用的 HWC 格式:
python复制X = batch1[b'data']
X = X.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1)
# 最终形状 (10000, 32, 32, 3)
这样你就能用 matplotlib 直接显示图片了。如果要拼接完整训练集:
python复制X_train = []
y_train = []
for i in range(1, 6):
batch = unpickle(f'cifar-10-batches-py/data_batch_{i}')
X_train.append(batch[b'data'])
y_train.extend(batch[b'labels'])
X_train = np.concatenate(X_train)
X_train = X_train.reshape(50000, 3, 32, 32).transpose(0, 2, 3, 1)
y_train = np.array(y_train)
测试集类似,读 test_batch 就行。读文件时注意要用 encoding='bytes',因为 CIFAR-10 里的键都是 bytes 类型,如果漏掉这个参数,Python 3 环境下很容易踩到编码坑。
4.4 把下载好的数据接到 PyTorch 和 TensorFlow 上
如果你手工下载并解压了数据,但后续想用 PyTorch 训练,最简单的做法是让 torchvision 直接读取你已解压的目录:
python复制from torchvision import datasets
train_set = datasets.CIFAR10(root='./data', train=True, download=False)
只要 ./data 目录下已经有 cifar-10-batches-py 文件夹,torchvision 就会直接使用它,不会再发起网络请求。这也是我比较推荐的数据准备方式:先集中下载,再分发给各台训练机器,每台机器都不需要外网权限。
对于 TensorFlow 来说,如果想直接读取手工下载的文件,可以考虑直接用上面那个 unpickle 函数读出 numpy 数组,再自行切分通道顺序。TensorFlow 的 Keras 接口虽然也能自动下载,但它有自己独立的缓存目录,手工下载的文件没法直接复用。
5. 常见问题与避坑记录
5.1 wget 下载到一半断掉怎么办
这是最高频的问题。源站服务器在国外,网络波动大,下载大文件时经常出现卡顿或者中断。解决办法就是开头提到的 wget -c,断点续传。另外,如果下载速度极慢,可以试试 curl,有时候两条线路的稳定性不一样,curl 反而能顺利跑完。究其原因,两边底层的连接方式和重试策略不同,换工具往往就能绕开问题。
5.2 下载下来的文件 MD5 值对不上
有几种可能:一是文件没下完整,二是下载过程中被墙体干扰,三是文件已经损坏。此时不要心存侥幸,直接删掉重下。可以换时间段重试,或者让同事、朋友下载好再传给你。MD5 校验的结果是硬性的,对不上就是有问题,强行解压很可能在中途报错。
5.3 torchvision 提示 SSL 证书错误
torchvision 底层的 urllib 请求会校验 SSL 证书,如果系统的 CA 证书过期或者缺失,就会出现 ssl.SSLCertVerificationError。常规解决办法是先更新系统证书:
bash复制sudo apt update
sudo apt install -y ca-certificates
如果还不行,检查一下 Python 环境里是否装了 certifi:
bash复制pip install --upgrade certifi
你也可以用更省事的方式绕开这个问题:手工用 wget 下载压缩包,放到 torchvision 的 root 目录下,让它跳过自动下载,这样就不涉及 SSL 请求了。
5.4 解压时报错 but not in gzip format
出现 gzip: stdin: not in gzip format 之类提示,几乎可以断定你下载到的不是真正的 tar.gz 文件。可能原因是你用了浏览器下载,但实际上浏览器保存了一个 HTML 错误页面。终端里用 wget 重新下载,下载完看看文件大小,如果只有几 KB,说明下载到了错误内容。校验 MD5 也能直接发现问题。
5.5 torchvision 反复提示重新下载
torchvision 在下载中断时会残留一些临时文件,这些残留文件可能导致 download=True 时反复触发下载逻辑。解决办法是检查 root 目录下是否有形如 .cifar-10-python.tar.gz.* 的临时文件,把它们删干净,再重新下载。如果数据集已经解压好了,直接设置 download=False。
5.6 Permission denied 权限不足
默认情况下,普通用户没有权限在 /root 或 /usr 等系统目录下写文件。如果你决定把数据集放在这类路径下,需要在命令前加 sudo,尤其是用 Python 脚本时容易忽略这一点。更好的方案是把数据放在自己的用户目录下,比如 ~/datasets,权限全是自己的,省去一堆麻烦。尤其在多账号共用的服务器上,把数据放在自己的目录而不是共享盘里,也能避免误删或权限冲突。
5.7 常见问题速查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| wget 下载中断 | 网络波动 | wget -c 断点续传,或换 curl |
| MD5 不匹配 | 文件损坏或下载不完整 | 删除后重下,校验 MD5 |
| SSL 证书报错 | 系统 CA 证书缺失 | 安装 ca-certificates 和 certifi |
| gzip 格式报错 | 下载到了 HTML 页面 | 删掉重下,用 wget/curl 拉取 |
| torchvision 重复下载 | 临时文件残留 | 清理 root 目录 .part 或临时文件 |
| Permission denied | 数据目录无写权限 | 换到用户目录,或 sudo chmod |
5.8 我的一点额外心得
下载数据集这件事,看起来只是训练流程的一小步,但它最容易拖慢整个项目的进度。我个人的习惯是:下载完第一件事永远是校验 MD5,校验通过后再解压;解压完会在终端打印一个 batch 文件的形状,确认能读出 10000 张图;最后才进入代码训练阶段。这套流程走下来,稳定度非常高。
另外,建议所有数据集统一放在规范目录下,比如 ~/datasets/cifar10,配合 tar 解压出来的 cifar-10-batches-py,路径固定之后,以后写脚本、写工程都能直接复用,不用每次现找。对于多台机器协作的场景,建议有人先把数据下载好,再同步到其余机器,而不是每台机器都从外网拉一次。这样既节省时间,也能保证数据版本一致,后续调模型、对比实验结果时不被数据差异干扰。
