如何用PyTorch将文件夹图片转为张量?加载报错求解决
问题原因
你保存的是ImageFolder数据集实例,而非已转换好的图片张量集合。加载后直接用torch.Tensor()尝试转换整个数据集,会触发错误——因为该方法仅能处理单个元素张量或可转为标量的对象,无法直接解析包含多个样本的数据集对象。
解决办法
方法1:提前提取并保存所有图片张量
修改保存代码,把数据集中所有图片的张量提取出来合并成一个大张量后保存,这样加载后直接得到张量集合:
import torch from torchvision import transforms, datasets transform = transforms.Compose([transforms.ToTensor()]) dataset = datasets.ImageFolder(r'imagedata', transform=transform) # 提取所有图片张量,拼接成形状为 [样本数, 通道数, 高, 宽] 的大张量 all_image_tensors = torch.stack([sample[0] for sample in dataset]) torch.save(all_image_tensors, 'train_data.pt')
加载代码简化为:
train_codes = torch.load(os.path.join(self.data_dir, "train_data.pt"))
方法2:直接加载数据集对象并正常使用
如果需要保留数据集的标签等配套信息,无需转成单个张量,直接加载后按数据集方式操作:
# 加载保存的数据集对象 dataset = torch.load(os.path.join(self.data_dir, "train_data.pt")) # 获取单个样本(图片张量 + 标签) single_image, single_label = dataset[0] # 批量处理可搭配DataLoader from torch.utils.data import DataLoader dataloader = DataLoader(dataset, batch_size=32, shuffle=True) for batch_images, batch_labels in dataloader: # 执行你的批量数据处理逻辑 pass
注意:直接保存
ImageFolder对象时,需确保原图片文件夹的结构(目录、分类文件夹名称)未发生变化,否则加载后可能无法正确读取图片(ImageFolder本质是懒加载模式,保存的是数据集配置而非已转换的张量)。优先推荐方法1,能直接保存已转换好的张量,避免路径依赖问题。
内容的提问来源于stack exchange,提问作者godzillabeast
相关产品推荐
相关产品推荐

