运行MNIST代码报错“MNIST object has no attribute data”求修复方案
修复"MNIST object has no attribute data"错误
这是一个很常见的PyTorch/torchvision版本API变更导致的问题,我来帮你一步步解决:
错误原因
你当前使用的torchvision版本中,datasets.MNIST默认返回的是包含PIL图像对象和标签的数据集实例,并没有直接暴露.data和.targets属性——这些属性是旧版本torchvision的API,或者仅当数据集内部存储张量格式数据时才存在。
修复方案
推荐两种可靠的解决方法,优先选择第一种:
方法一:使用transform将图像转为张量(规范做法)
在创建MNIST数据集时,通过transform参数将PIL图像自动转为PyTorch张量,之后可以灵活获取数据:
import torch from torchvision import datasets, transforms # 定义转换流水线,将PIL图像转为张量 transform = transforms.Compose([ transforms.ToTensor(), ]) # 创建带transform的数据集 mnist_train_set = datasets.MNIST(data_dir + '/mnist/', train=True, download=True, transform=transform) mnist_test_set = datasets.MNIST(data_dir + '/mnist/', train=False, download=True, transform=transform) # 一次性提取所有训练数据和标签 train_input = torch.stack([img for img, _ in mnist_train_set]).float() train_target = torch.tensor([target for _, target in mnist_train_set]) # 一次性提取所有测试数据和标签 test_input = torch.stack([img for img, _ in mnist_test_set]).float() test_target = torch.tensor([target for _, target in mnist_test_set])
方法二:兼容旧版本API(不推荐长期使用)
如果你的torchvision版本较旧(比如0.10.x及以前),可以替换为旧版本的属性名,但这个API已经被标记为废弃,未来版本可能会移除:
# 注意:该方法依赖旧版本torchvision,仅作临时兼容用 train_input = mnist_train_set.train_data.view(-1, 1, 28, 28).float() train_target = mnist_train_set.train_labels test_input = mnist_test_set.test_data.view(-1, 1, 28, 28).float() test_target = mnist_test_set.test_labels
更规范的使用方式
在实际训练中,更推荐使用DataLoader批量加载数据,这是PyTorch的标准用法,能自动处理批量、打乱等操作:
from torch.utils.data import DataLoader # 创建数据加载器 train_loader = DataLoader(mnist_train_set, batch_size=64, shuffle=True) test_loader = DataLoader(mnist_test_set, batch_size=64, shuffle=False) # 遍历加载批量数据 for batch_input, batch_target in train_loader: # batch_input的形状为 (64, 1, 28, 28),直接用于模型输入 # 在这里编写你的训练逻辑 pass
内容的提问来源于stack exchange,提问作者ForumWhiner
相关产品推荐
相关产品推荐

