You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch DataLoader加载MNIST两种方式为何维度存在差异?

MNIST两种DataLoader写法返回维度差异原因说明

核心差异是两种写法传入DataLoader的数据源不同,触发的预处理逻辑完全不一样:

  • 方式A的逻辑
    你传入DataLoader的是完整的trainset对象,属于torchvision封装的MNIST数据集类的实例。DataLoader拉取数据时会自动调用该实例的__getitem__方法,自动执行你提前定义的transform预处理流程:
    预处理第一步transforms.ToTensor()会把原本形状为[28, 28]的PIL灰度图/uint8格式numpy数组,转换为[通道数, 高度, 宽度]格式的浮点张量,MNIST是单通道灰度图,所以新增的通道维度值为1,这就是方式A中第二个维度为1的来源。
    单张样本经过预处理后形状为[1, 28, 28],按batch_size=64拼接后,最终返回的batch形状就是torch.Size([64, 1, 28, 28]),同时还会返回对应标签,所以可以用images, labels两个变量接收返回值。
  • 方式B的逻辑
    你传入DataLoader的是trainset.train_data,这是MNIST数据集加载完成后的原始像素张量,没有经过任何transform预处理,本身形状就是[训练集总样本数, 28, 28]的uint8类型张量。
    直接把原始张量传入DataLoader时,DataLoader只会按batch_size简单切分张量,不会触发任何数据集类的预处理逻辑,也不会返回标签,所以只能用单个images变量接收返回值,切分后的batch形状就是torch.Size([64, 28, 28]),不存在通道维度。

注:新版本PyTorch中train_data属性已更名为data,旧属性仅做兼容保留,二者本质都是未经过预处理的原始像素数据。

内容的提问来源于stack exchange,提问作者Watchung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:57:01