5.1 FashionMNIST数据准备


5.1 Fashion MNIST 数据准备

本节摘要:有监督图像分类需要大量带标签的图。MNIST 是 28×28 手写数字灰度图,深度学习的传统「你好世界」。Fashion MNIST 保持同样的尺寸与划分——七万张、六万训练、一万测试、十类——但内容换成服装,类别之间更容易混淆,当第一个「非数字」任务更合适。Keras 用 keras.datasets.fashion_mnist.load_data() 得到 NumPy 数组;PyTorch 用 torchvision 的 FashionMNISTToTensor。十类英文名只用于读预测,标签仍是 0 到 9。

本节导读

阅读完本节,你应当能够:

  1. 对比 MNIST 与 Fashion MNIST 的相同点与故意不同点
  2. 复述训练/测试划分与图像尺寸、通道数
  3. 列出十个类别名称,并说明它们不进入损失函数
  4. 写出两侧加载后第一件要打印的事:shape、dtype、min/max、标签分布

为什么不是随便几张网图

原文把数据集重要性写得很小学:教孩子认猫狗要很多图。模型也一样。但网图尺寸不一、标签脏、版权和预处理会把入门对照淹没。MNIST 家族的价值是:尺寸已经对齐,标签已经是整数,加载器两边都有,CPU 能训。你可以把注意力放在框架差异,而不是爬虫。

MNIST:0 到 9 手写数字,28×28 灰度,单通道。它太容易:简单模型也能很高准确率,曲线诊断时「还在欠拟合」的空间不大。Fashion MNIST 故意做成同一容器装更难的内容:T 恤、裤子、套头衫、连衣裙、外套、凉鞋、衬衫、运动鞋、包、踝靴。衬衫与 T 恤、外套与套头衫会互相认错,5.3 的混淆直觉才有东西可看。原文引言与 5.1 都选定它作为本章任务。

相同点要当契约背下来:28×28、灰度、70000、60000/10000、10 类。不同点:语义与难度。不要把数字 MNIST 的准确率预期直接贴到 Fashion 上,也不要因为 Fashion「不够大」就觉得必须上 ImageNet。本课目标是流程对照,不是刷榜。

💡 关键直觉:选入门数据是在选「误差从哪来」。尺寸已经对齐时,误差更可能来自模型与预处理,这正是我们想对照的。

两侧加载入口与必须打印的字段

Keras:fashion_mnist = keras.datasets.fashion_mnist(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()。形状注释原文写明:(60000, 28, 28)(10000, 28, 28)。像素常为 0–255 整数,随后 / 255.0 变 0–1 浮点。Flatten 层会处理 28×28,不必提前 reshape 成 784,原文明确说可以先不手动 reshape。

PyTorch:transforms.Compose([ToTensor(), Normalize((0.5,), (0.5,))])FashionMNIST(..., train=True/False, download=True, transform=...),再 DataLoader 64。ToTensor 会引入通道维,形状变成 (N, 1, 28, 28)。这是与 Keras 数组路径的第一形状分歧,2.1 已预警。若你关闭 Normalize,只 ToTensor,取值 0–1,更接近 Keras 除以 255。公平对照建议:要么 PT 也只用 ToTensor,要么 Keras 也减均值除方差。本节先按原文各自默认加载,但打印 min/max,让差异可见。

字段 Keras load_data torchvision FashionMNIST
图像形状 60000, 28, 28 经 Loader 后 64, 1, 28, 28
取值原文 除以 255 到 0-1 ToTensor 后 0-1 再 Normalize
标签 整数数组 60000 批次 Long 张量
类别名 需自己列 原文给了十元元组
下载 库内缓存 download 开关

类别元组原文:T-shirt/top, Trouser, Pullover, Dress, Coat, Sandal, Shirt, Sneaker, Bag, Ankle boot。Keras 节也定义了对应中文或英文名方便理解。损失函数只见数字 0–9。报告错误案例时用名字,计算损失时用索引。不要把名字字符串送进 CrossEntropy。

标签分布应大致均衡,十类各约六千训练样本。若你自己切验证集,从训练集再划 5000 或 10%,保持类别比例。原文有的示例直接用测试集当 validation_data。严格说测试集不应当验证,否则 5.3 的「泛化」被污染。对照课建议:从 60000 里划出验证,测试只在最终报告用一次。若你跟原文把测试当验证,必须在报告里承认这是教学简化。

质量检查与管线衔接

好数据集的原文标准:够大、多样、标注准、适合任务。Fashion MNIST 够入门,不够代表真实衣橱照片(背景、光照、遮挡)。模型在其上 90% 准确率,不说明可以开服装店。把预期写小,和 1.1 的验收句一致。

检查清单 1 打印 train_images.shape 或 一批 inputs.shape 2 打印 min max 确认 0-1 或 约-1到1 或仍是 0-255 3 打印 train_labels[:10] 确认是整数不是 one-hot 4 用类别名看几张图 确认标签没对错位 5 划验证集 并保证测试集此后只碰一次

⚠️ 常见坑:Keras 忘了除以 255,像素 0–255 进 Adam 默认学习率,损失震荡。PT 把已经 Normalize 的张量再除 255,输入挤在接近 0 的区间,学习变慢。两侧都打印 min/max 就能当场抓住。

可视化:原文依赖绘图库看图。平台教程用文字描述即可:第 0 类 T 恤是短袖上衣,第 6 类衬衫更易与它混。混淆对 5.3 有用。不要为了可视化引入文件路径保存图片;笔记本内联显示即可。

与第 3 章衔接:Keras 数组可直接 fit,也可包成 from_tensor_slices。PT 必须 Loader。验证集 Loader shuffle=Falsenum_workers Windows 先 0。这些重复不是啰嗦,是实战当天最容易忘的。

数据增强本课可以不做。翻转服装图要小心:裤子左右翻还是裤子,鞋子左右翻可能改变语义。没有把握就别增强,先跑干净基线。基线准确率记下来,再谈增强是否提升验证,否则你分不清是增强还是你同时改了学习率。

最后,缓存与重复下载。两侧加载器各有缓存目录,对照等于可能存两份。网络失败时的表现像「框架坏了」。先验证安装节的加法,再加载数据,问题分流会干净很多。

划分验证集与类别平衡

从 60000 张训练里划 5000 或 10% 做验证,用分层抽样更稳,保证十类比例接近。随机切而不分层,某一类可能在验证里过少,准确率方差变大,5.3 会误判过拟合。Keras 可用切分数组;PT 用 Subsetrandom_split 并固定生成器。切完打印各类计数。测试集 10000 保持官方划分,不要把测试样本混进训练,否则你的数字无法与任何公开基线对照——即使本课不竞赛,污染测试集也会让你自己的两次实验无法比。

官方划分已经打乱过,但加载后 Keras 数组的顺序是固定的。fit 默认 shuffle 每个 epoch。PT Loader 训练 shuffle True。验证 Loader False。这三条写进 5.1 的契约,5.2 实现时不要改。若你为了「看看前几张是不是靴子」把训练也关 shuffle,记住回头打开,否则对照了无打乱的优化动力学。

像素直方图:多数 Fashion 图像背景接近 0,服装在中间灰度。除以 255 后仍偏暗。Normalize 0.5 把它拉到零附近,对 ReLU 网络的前层激活分布有影响。这不是谁对谁错,是两种常见默认。选一种作为对照标准并两侧执行。我更倾向两侧都 0–1,少一次减均值,便于和原文 Keras 引言对齐;若你跟原文 PT 走 Normalize,就让 Keras 也减 0.5 除 0.5。关键是同一句话出现在两侧代码注释里。

问题:MNIST 数字和 Fashion 能不能共用同一套模型代码?

能,因为形状与类别数相同,这正是 Fashion 的设计。把加载入口换掉即可。数字任务通常更高准确率,不要用数字任务的 98% 当 Fashion 的心理门槛。共用代码时,类别名元组必须换,否则你把靴子打印成「数字 9」。损失与层不用换。这是「同一容器」的好处:对照框架时少一个变量,对照任务难度时只换数据。

加载失败时先看网络再看磁盘配额。Keras 与 torchvision 缓存目录不同,公司电脑清缓存可能只清了其中一个,造成「一侧能加载一侧重新下载」。下载中断留下半截文件,有时会解压报错,删除对应缓存再下。教程不写绝对路径,但你要知道失败时去框架文档里找「缓存位置」这一节,而不是重装整个 TensorFlow。这和 1.3 的分流原则一致:数据问题先当数据问题。

十类里凉鞋、运动鞋、踝靴都是鞋,包是包,上装互相像。这不是标签错误,是任务难度。把它写进契约,5.3 看到这些混淆时才不会立刻加层。MNIST 数字的「3 和 5 有时像」是同类现象。入门数据故意保留可解释的混淆,好让你练习读错例,而不是练习下载更大的数据。更大的数据会把框架差异与数据差异缠死,对照课先拒绝这个诱惑。

像素 dtype 在 Keras 加载后常是整型,除以 255.0 才变浮点。忘记点零,在某些 Python 版本里整数除法会截断,图像全黑。PT 的 ToTensor 负责这项转换。两侧都打印 dtypemax,应看到浮点且最大约为 1 或约为 1(Normalize 后约为 1)。仍是 255,归一化没发生。

本节速览

  • 同一容器更难内容:28×28、七万张、十类;Fashion 比数字 MNIST 更适合看混淆
  • Keras 数组路径:load_data 得 (60000,28,28),除以 255,Flatten 可不先 reshape
  • PT torchvision 路径:ToTensor+可选 Normalize 0.5,批次 64,1,28,28
  • 名字只用于显示:损失吃 0–9
  • 测试集纪律:教学若拿测试当验证,必须声明;更优是另划验证
  • min/max 第一行打印:抓住 255 与重复归一化

数据契约验收:70000、60000 加 10000、28 乘 28、十类、标签 0 到 9、类别名只用于显示。Keras 打印 (60000,28,28) 与除以 255 后的 min max。PyTorch 打印批次 (64,1,28,28) 与 Normalize 与否对应的范围。验证集最好从训练分层切出,测试锁死。官方测试当验证必须声明。像素 dtype 变为浮点。错位标签用肉眼看图抓住。增强默认关闭。缓存失败当数据问题分流。数字 MNIST 可共用模型代码但必须换名字元组。契约不完整,5.2 的准确率不受理。

契约页还要写清验证集来源与大小。5000 张分层切出,各类大约 500,准确率方差可接受。切 500 张则方差大,5.3 会误判。随机切而不分层,某类可能过少。生成器种子固定,否则每次启动验证样本都变,曲线不能比。测试 10000 保持官方划分,这是唯一能和外部数字对照的锚,即使本课不竞赛。Keras 与 torchvision 下载各一份缓存,磁盘预算按两份算。中断下载删半截再来。像素仍是 255 说明没归一化。标签若是 one-hot,损失必须改名,本课不走这条,保持整数。类别元组顺序与整数约定一致,写反则错例阅读全错。增强关闭。水平翻转若以后要开,靴子类通常仍可接受,垂直翻转不要。契约写完请朗读一遍:七万张,二十八,十类,训练打乱,验证不打乱,测试锁死。

把朗读契约当成 5.2 开工仪式:七万张,二十八像素,十类,六万加一万,标签整数,名字只显示,训练打乱,验证不打乱,测试锁死,min max 已打印。仪式少于二十秒,能挡住一半假对照。分层验证大约每类五百。缓存按两份预算。数字 MNIST 换名字元组即可共用模型。增强默认关。垂直翻转禁止。dtype 必须浮点。仍是 255 就停。契约页不是背景介绍,是合同。合同不签字,实现节不受理准确率。

把二十秒朗读当成开工仪式。仪式漏一句就补一句再实现。合同比代码先存在。代码可以短,合同不能短。合同短了,短代码会生产不可比的数字。不可比的数字看起来像结论,其实是未签字。未签字的结论,对照课作废。

审查朗读契约时有没有人在场可以复述。自己对自己朗读容易跳句。跳句的合同仍算没签。签的标准是能不看稿说出划分与 min max。说不出,回去打印。打印是合同附件。附件比引言重要。引言可以略读,附件不能。

下一节按这份契约双侧实现 MLP 与简单 CNN,把第 4 章的声明和循环接到真数据上。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U