PyTorch 中的Dataset 类和Dataloader 类帮助我们将自己的训练数据输入网络。数据集类用于提供访问数据集中所有训练或测试样本的接口。为了实现这一点,您必须至少实现两个方法,__getitem__ 和 __len__,以便每个训练样本都可以通过其索引访问。在类的初始化部分,我们加载数据集(作为浮点类型)并将它们转换为浮点炬张量。 __getitem__ 将返回特征和目标值。
这些方法有什么区别?
在 PyTorch 中,您可以准备数据以便 PyTorch DataLoader 可以使用它并获得一个可迭代对象,或者您可以重载默认 DataLoader 以执行一些自定义操作,例如,如果您想对文本/图像进行一些预处理,从视频剪辑等中堆叠帧。
我们的 DataLoader 的行为类似于迭代器,因此我们可以循环遍历它并每次获取不同的小批量。
基本示例
from torch.utils.data import DataLoader
train_loader = DataLoader(dataset=train_data, batch_size=16, shuffle=True)
valid_loader = DataLoader(dataset=valid_data, batch_size=16, shuffle=True)
# To retrieve a sample mini-batch, one can simply run the command below —
# it will return a list containing two tensors:
# one for the features, another one for the labels.
next(iter(train_loader))
next(iter(valid_loader))
自定义示例
import torch
from torch.utils.data import Dataset, Dataloader
class SampleData(Dataset):
def __init__(self, data):
self.data = torch.FloatTensor(data.values.astype('float'))
def __len__(self):
return len(self.data)
def __getitem__(self, index):
target = self.data[index][-1]
data_val = self.data[index] [:-1]
return data_val,target
train_dataset = SampleData(train_data)
valid_dataset = SampleData(valid_data)
device = "cuda" if torch.cuda.is_available() else "cpu"
kwargs = {'num_workers': 1, 'pin_memory': True} if device=='cuda' else {}
train_loader = DataLoader(train_dataset, batch_size=train_batch_size, shuffle=True, **kwargs)
test_loader = DataLoader(valid_dataset, batch_size=test_batch_size, shuffle=False, **kwargs)
你为什么要使用一个而不是另一个?
这完全取决于您的用例和您想要的控制量。 PyTorch 为您提供了所有的权力,您将决定您想要多少。假设你正在解决一个简单的图像分类问题,那么,
您可以简单地将所有图像放在一个根文件夹中,每个子文件夹包含属于特定类别的样本,并用类别名称标记文件夹。在训练时,我们只需要指定根文件夹的路径,PyTorch DataLoader 就会自动从每个文件夹中挑选图像并训练模型。
但另一方面,如果您在大型视频文件中对视频剪辑或视频序列进行分类,通常称为视频标记,那么您需要编写自定义 DataLoader 以从视频中加载帧,将其堆叠并提供输入数据加载器。
使用可以在下面找到一些有用的链接以供进一步参考:
https://pytorch.org/docs/stable/data.html
https://stanford.edu/~shervine/blog/pytorch-how-to-generate-data-parallel
https://pytorch.org/tutorials/beginner/data_loading_tutorial.html