认识图像数据
了解图像在计算机中的表示方式:像素、矩阵、通道与张量形状,并加载 MNIST。
从向量到图像
到目前为止,我们喂给神经网络的输入都是一个个长度固定的 向量 —— 比如二维的坐标点 ,或者上一章里展平后的特征。 但现实世界里,最具代表性的高维数据之一是 图像 :照片、医学影像、卫星图、扫描件……
在写出任何图像模型之前,先得明确一件事: 一张图片在计算机里到底长什么样? 它又是如何被表示成可以输入神经网络的向量的? 这一节我们先把图像数据的"形状"看清楚。
图像就是矩阵
最简单的图像是 灰度图 :每个位置上只有一个数值,代表该点的"亮度"。 分辨率为 的灰度图,就是一个 行 列的数字矩阵—— 矩阵里的每个元素就是图像里的一个 像素 ,二者一一对应。
像素的亮度通常用一个 8 位无符号整数( uint8 ,取值 0–255)表示: 0 表示纯黑、255 表示纯白,中间的整数是不同深浅的灰。
在 Python 里用 PIL (Pillow)打开一张图片,再转成 numpy 数组, 就能直接看到这个矩阵:
通道:从一张矩阵到多张矩阵
灰度图能表示明暗,但没办法表示 颜色 。 要表示彩色图像,最常见的做法是把同一张图像拆成 红、绿、蓝 三个分量—— 三个分量各自是一个尺寸相同的矩阵。 每一张这样的矩阵就叫一个 通道 (channel), 把多个通道沿一个新的维度叠在一起,就构成完整的彩色图像。
一张图像有几个通道并不固定:既有单通道的 灰度图 与 二值图 , 也有三通道的 RGB 彩色图 ,特殊场景下还会用到 更多通道 。 下面先快速对照这几类:
其中 RGB 彩色图最为常见。下面的交互演示以一张彩色小图为例, 展示它如何被拆成 R、G、B 三个通道,又如何由这三张矩阵叠加还原成原图:
鼠标悬浮按钮可预览效果,点击锁定显示;"分离视图"会把三个通道并排展示。
归根结底, 每个通道就是一个尺寸相同的矩阵 ; 把通道数记作 ,那么一张 的图像 就成了一个三维数组——可以等价地理解为 每个像素是一个长度为 的向量 , 也就是该像素的"特征向量"。
在 PyTorch 里的形状约定
到了代码里,图像的三个维度—— 通道 、 高 、 宽 —— 在不同库里排列顺序并不一致:
- numpy / PIL 约定 :通道维放在最后;
- PyTorch 约定 :通道维放在最前。
PyTorch 把通道放在最前面,是历史上的默认约定,和卷积运算(后续课程会讲)的常见实现方式相匹配。 本节只需要记住这个约定即可,不必深入内存细节。
把 numpy 数组转为 PyTorch 张量、并自动重排成 的最常用工具,是 torchvision.transforms.ToTensor :
本章的练手数据集:MNIST
本章后续课程都会以 MNIST 为示例数据集。它是手写数字识别领域最经典的入门数据集:
- 内容 :0 – 9 的手写阿拉伯数字
- 规模 :60000 张训练图 + 10000 张测试图
- 规格 : 灰度图,1 通道
- 预处理 :数字已经做过居中、缩放与归一化,干净度较高
PyTorch 的 torchvision.datasets 模块直接内置了 MNIST 加载器, 几行代码就能下载并取出第一张样本: