PyTorch加载自己的数据集

PyTorch加载自己的数据集

0.引言

PyTorch提供了几种方法来加载自己的数据集。下面是一些常用的方法:

  • 1.使用torch.utils.data.Dataset类创建自定义数据集

这是一种常见的方式,用于自定义数据集。创建一个类,继承自torch.utils.data.Dataset,并重写__len__()__getitem__()方法。__len__()方法应该返回数据集的大小,__getitem__()方法应该返回一个样本。例如,以下是一个自定义数据集类的示例:

import torch
from torch.utils.data import Dataset

class MyDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets
    
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, index):
        x = self.data[index]
        y = self.targets[index]
        return x, y
  • 2.使用torch.utils.data.DataLoader类加载数据集

torch.utils.data.DataLoader类用于加载数据集。它可以自动对数据集进行批处理、打乱和多线程加载。下面是一个使用DataLoader加载数据集的示例:

from torch.utils.data import DataLoader

dataset = MyDataset(data, targets)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
  • 3.使用torchvision.datasets模块加载常见数据集
    torchvision.datasets模块提供了一些常见的数据集,例如MNIST、CIFAR等。可以使用这些数据集来测试模型或学习如何加载数据集。以下是一个使用torchvision.datasets加载MNIST数据集的示例:
import torchvision.datasets as datasets
import torchvision.transforms as transforms

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

trainset = datasets.MNIST(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=32,
                                          shuffle=True, num_workers=2)

上面的代码将下载MNIST数据集,并使用ToTensor()和Normalize()转换图像。然后使用DataLoader加载数据集。

1.定义自己的Dataset类

创建一个类,继承自torch.utils.data.Dataset,并重写__len__()__getitem__()方法:

  • __init__ 用于向类中传入外部参数,同时定义样本集
  • __len__()方法应该返回数据集的大小
  • __getitem__()方法应该返回一个样本

例如,以下是一个自定义数据集类的示例:

import torch
from torch.utils.data import Dataset

class MyDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets
    
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, index):
        x = self.data[index]
        y = self.targets[index]
        return x, y

这里另外给出一个例子,其中图片存放在一个文件夹,另外有一个csv文件给出了图片名称对应的标签。这种情况下需要自己来定义Dataset类:

class MyDataset(Dataset):
    def __init__(self, data_dir, info_csv, image_list, transform=None):
        """
        Args:
            data_dir: path to image directory.
            info_csv: path to the csv file containing image indexes
                with corresponding labels.
            image_list: path to the txt file contains image names to training/validation set
            transform: optional transform to be applied on a sample.
        """
        label_info = pd.read_csv(info_csv)
        image_file = open(image_list).readlines()
        self.data_dir = data_dir
        self.image_file = image_file
        self.label_info = label_info
        self.transform = transform

    def __getitem__(self, index):
        """
        Args:
            index: the index of item
        Returns:
            image and its labels
        """
        image_name = self.image_file[index].strip('\n')
        raw_label = self.label_info.loc[self.label_info['Image_index'] == image_name]
        label = raw_label.iloc[:,0]
        image_name = os.path.join(self.data_dir, image_name)
        image = Image.open(image_name).convert('RGB')
        if self.transform is not None:
            image = self.transform(image)
        return image, label

    def __len__(self):
        return len(self.image_file)

构建好Dataset后,就可以使用DataLoader来按批次读入数据了,实现代码如下:

from torch.utils.data import DataLoader

train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, num_workers=4, shuffle=True, drop_last=True)
val_loader = torch.utils.data.DataLoader(val_data, batch_size=batch_size, num_workers=4, shuffle=False)

其中:

  • batch_size:样本是按“批”读入的,batch_size就是每次读入的样本数

  • num_workers:有多少个进程用于读取数据,Windows下该参数设置为0,Linux下常见的为4或者8,根据自己的电脑配置来设置

  • shuffle:是否将读入的数据打乱,一般在训练集中设置为True,验证集中设置为False

  • drop_last:对于样本最后一部分没有达到批次数的样本,使其不再参与训练

这里可以看一下加载的数据。PyTorch中的DataLoader的读取可以使用next和iter来完成

import matplotlib.pyplot as plt
images, labels = next(iter(val_loader))
print(images.shape)
plt.imshow(images[0].transpose(1,2,0))
plt.show()
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用PyTorch加载自己的数据集并进行训练的完整代码示例: ```python import torch from torchvision import datasets, transforms from torch.utils.data import DataLoader import torch.nn as nn import torch.optim as optim # 定义数据集的预处理转换 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) # 定义自己的数据集类 class CustomDataset(torch.utils.data.Dataset): def __init__(self, ...): # 读取数据集并进行必要的预处理操作 def __len__(self): # 返回数据集的长度 def __getitem__(self, index): # 返回指定索引处的数据样本 # 创建数据集实例 train_dataset = CustomDataset(...) test_dataset = CustomDataset(...) # 创建数据加载器 batch_size = 64 train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) # 定义模型 class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() # 定义模型结构 def forward(self, x): # 定义前向传播过程 model = MyModel() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练模型 num_epochs = 10 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) for epoch in range(num_epochs): train_loss = 0.0 model.train() for images, labels in train_loader: images = images.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() train_loss += loss.item() * images.size(0) train_loss /= len(train_loader.dataset) print(f"Epoch {epoch+1}/{num_epochs}, Training Loss: {train_loss}") # 在测试集上评估模型 model.eval() test_loss = 0.0 correct = 0 with torch.no_grad(): for images, labels in test_loader: images = images.to(device) labels = labels.to(device) outputs = model(images) loss = criterion(outputs, labels) test_loss += loss.item() * images.size(0) _, predicted = torch.max(outputs.data, 1) correct += (predicted == labels).sum().item() test_loss /= len(test_loader.dataset) accuracy = correct / len(test_loader.dataset) print(f"Test Loss: {test_loss}, Accuracy: {accuracy}") ``` 请注意,上述代码中有一些需要替换为你自己数据集和模型的部分,如`CustomDataset`类的定义、数据集实例的创建、模型的定义和前向传播过程等。你需要根据你自己的数据集和模型来进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值