pytorch-Dataset类和DataLoader类的基本写法

pytorch-Dataset类的基本写法

1、Dataset类简介

是pytorch中用来说明数据集的类,主要说明文件路径、数据集的特性、观察数据、格式转换(转为tensor)等

2、Dataset类简介

是pytorch中用来导入数据集的类,主要负责分割数据(分成训练轮数epoch, 小批量batch)、拼接数据等

3、Dataset说明

(1) MyData 继承了Dataset类,要重写三个虚函数:__ init __ , __ getitem__, __ len __
(2) self 相当于 this , self.x, x是本类的全局变量
(3) 路径字符串连接要用os.path.join(root_dir, sub_dir)

4、Dataset代码

from torch.utils.data import Dataset
from PIL import Image
import os

class MyData(Dataset):

    def __init__(self, root_dir, label):
        self.root_dir = root_dir
        self.label = label
        self.path = os.path.join(self.root_dir,self.label)
        self.img_names = os.listdir(self.path)

    def __getitem__(self, idx):
        img_name = self.img_names[idx]
        img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)
        img = Image.open(img_item_path)
        return img, self.label

    def len(self):
        return len(self.img_path)

if __name__ == '__main__':
    root_dir = "data/hymenoptera_data/train"
    ants_label = "ants"
    ants_dataset = MyData(root_dir, ants_label)

5、DataLoader代码

import torchvision
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torch.utils.data import DataLoader

trans = torchvision.transforms.Compose([
    torchvision.transforms.ToTensor()
])

if __name__ == '__main__':

    test_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, transform=trans, download=True)
    test_loader = DataLoader(dataset=test_set, batch_size=64, shuffle=True, num_workers=0, drop_last=False)
    writer = SummaryWriter("dataloader")
    step = 0

for epoch in range(2):
    step = 0
    for data in test_loader:
        img, target = data
        writer.add_images("Epoch: {}".format(epoch), img, step)
        step = step + 1

    writer.close()

### PyTorch Dataset 的实现方法 在 PyTorch 中,`Dataset` 是一个抽象,用于封装数据集的核心逻辑。为了创建自定义数据集,需要继承 `torch.utils.data.Dataset` 并实现两个核心方法:`__getitem__(self, index)` `__len__(self)`。 #### 方法说明 1. **`__getitem__(self, index)`**: 此方法应返回指定索引位置的数据及其对应标签。对于图像分任务,通常返回一对 `(image, label)` 数据结构[^1]。 2. **`__len__(self)`**: 返回整个数据集中样本的数量,即数据集的大小。 --- ### 自定义 Dataset 实现示例 以下是基于上述描述的一个完整自定义 `Dataset` 示例: ```python from torch.utils.data import Dataset from PIL import Image import os class CustomImageDataset(Dataset): def __init__(self, root_dir, transform=None): """ 初始化函数,设置路径转换器。 参数: root_dir (str): 图像文件夹的根目录。 transform (callable, optional): 可选的变换操作,应用于图像上。 """ self.root_dir = root_dir self.transform = transform self.image_files = [f for f in os.listdir(root_dir) if f.endswith(('.png', '.jpg', '.jpeg'))] def __len__(self): """返回数据集中的总样本数""" return len(self.image_files) def __getitem__(self, idx): """ 获取指定索引处的图像标签 参数: idx (int): 样本的索引 返回: tuple: (image, label),其中 image 是 PIL.Image 对象,label 是整数值。 """ img_path = os.path.join(self.root_dir, self.image_files[idx]) image = Image.open(img_path).convert('RGB') label = int(self.image_files[idx].split('_')[0]) # 假设文件名格式为 {label}_{id}.jpg if self.transform: image = self.transform(image) return image, label ``` 此代码实现了以下功能: - 使用 `os.listdir()` 列举给定目录下的所有图片文件[^3]。 - 定义了一个简单的标签提取机制(假设文件名为 `{label}_{id}.jpg` 形式)[^4]。 - 支持通过 `transform` 参数应用额外的预处理操作,例如归一化或增强。 --- ### DataLoader 配合使用 `DataLoader` 提供了一种高效的方式来批量加载数据并支持多线程加速。可以这样配合使用: ```python from torch.utils.data import DataLoader from torchvision import transforms # 定义数据预处理步骤 data_transforms = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), # 将图像转为 Tensor,并将其归一化到 [0, 1] ]) # 创建数据集实例 dataset = CustomImageDataset(root_dir='path/to/images', transform=data_transforms) # 创建 DataLoader 实例 dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4) ``` 在此配置下: - 每次迭代会返回一批大小为 32 的张量数据。 - 同时启用多个工作线程 (`num_workers`) 来提高效率。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值