关于torchvision加载数据集的小问题

现有以下完整程序可以成功加载数据集,使用ImageFolder函数:

import torch
import torchvision
import matplotlib.pyplot as plt
from torchvision import transforms,utils
import numpy as np
# 使用ImageFolder需要保证数据集以下列形式组织:
'''
root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png

root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png
'''
img_data = torchvision.datasets.ImageFolder(
    root = r'E:\机器学习数据集\flower_photos',
    transform=transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor()])
        )
print('数据集类别:',img_data.classes)
print('数据集大小:',len(img_data))

# 使用torch.utils.data.DataLoader加载,形成一个DataLoader类实例
data_loader = torch.utils.data.DataLoader(img_data,batch_size=36, shuffle=True)
print(len(data_loader))

def imshow(img):
#    img = img / 2 + 0.5     # unnormalize
    img = torchvision.utils.make_grid(img, nrow=6)
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.title('Batch from dataloader')
    plt.xticks([])
    plt.yticks([])
    plt.show()

# get some random training images
dataiter = iter(data_loader)
images, labels = dataiter.next()
print(images.shape, labels)
# show images
imshow(images)

上面程序用了三种变换:Resize,Crop和ToTensor,问题就出现在这里了,

  1. 问题1:如果去掉Crop,只留下Resize和ToTensor,程序报错:
RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 0. Got 408 and 341 in dimension 3 at ..\aten\src\TH/generic/THTensor.cpp:711
  1. 问题2 :去掉ToTensor或者将ToTensor放到前面而不是最后一项,程序报错:
TypeError: batch must contain tensors, numbers, dicts or lists; found <class 'PIL.Image.Image'>

其他情况不好有问题,先留着这两个问题,以后研究深入了再解答。

### 使用 `torchvision` 加载常见数据集 在深度学习领域,特别是计算机视觉任务中,`torchvision.datasets` 提供了许多常用的内置数据集接口,可以直接用于加载和预处理数据。以下是关于如何使用 `torchvision` 来加载常见的数据集并结合 `transforms` 进行数据增强的详细介绍。 #### 数据集与变换的结合 为了高效地处理图像数据,在实际应用中通常需要将数据集 (`dataset`) 和数据转换 (`transforms`) 结合起来使用。通过这种方式,可以在每次迭代时动态地对输入数据施加随机变换,从而增加模型的泛化能力[^1]。 #### 常见数据集加载方式 以下是一些典型的例子,展示如何利用 `torchvision.datasets` 下载和加载常用的数据集: ##### MNIST 手写数字识别数据集 MNIST 是一个经典的手写字体分类数据集,常被用来验证机器学习算法的有效性。 ```python from torchvision import datasets, transforms from torch.utils.data import DataLoader # 定义数据转换操作 transform = transforms.Compose([ transforms.ToTensor(), # 将 PIL 图像转为 Tensor 并缩放到 [0,1] transforms.Normalize((0.5,), (0.5,)) # 归一化到 [-1,1] ]) # 加载训练集 train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) # 加载测试集 test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) # 创建 DataLoaders train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False) ``` ##### CIFAR-10 图像分类数据集 CIFAR-10 是另一个广泛应用于图像分类研究的小型彩色图像数据集,包含 10 类标签。 ```python # 定义更复杂的转换链路 cifar_transform = transforms.Compose([ transforms.RandomHorizontalFlip(), # 随机水平翻转 transforms.RandomCrop(32, padding=4), # 随机裁剪 transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # ImageNet 的均值方差标准化 ]) # 加载 CIFAR-10 训练集 cifar_train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=cifar_transform) # 测试集无需增强 cifar_test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transforms.ToTensor()) # 构建 Dataloader cifar_train_loader = DataLoader(cifar_train_dataset, batch_size=64, shuffle=True) cifar_test_loader = DataLoader(cifar_test_dataset, batch_size=64, shuffle=False) ``` ##### 自定义文件夹结构下的图像数据集 如果用户的项目涉及自定义目录中的图片,则可以借助 `datasets.ImageFolder` 方法快速构建数据管道[^2]。 假设有一个如下所示的文件夹布局: ``` root/ class_1/ img1.jpg img2.jpg class_2/ imgA.png imgB.png ``` 可以通过下面的方式读取该数据源: ```python image_folder_transforms = transforms.Compose([ transforms.Resize((224, 224)), # 调整大小至统一尺寸 transforms.ToTensor() ]) custom_image_dataset = datasets.ImageFolder(root='path/to/root', transform=image_folder_transforms) custom_data_loader = DataLoader(custom_image_dataset, batch_size=32, shuffle=True) ``` 以上展示了三种不同场景下使用 `torchvision` 处理数据的方法。无论是官方支持的标准数据集还是个人收集整理的素材库,都可以轻松集成到 PyTorch 工作流之中[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值