6

我正在为 NLP 相关任务创建自定义数据集。

在 PyTorch custom datast tutorial中,我们看到该__getitem__()方法在返回样本之前为转换留出了空间:

def __getitem__(self, idx):
        if torch.is_tensor(idx):
            idx = idx.tolist()

        img_name = os.path.join(self.root_dir,
                                self.landmarks_frame.iloc[idx, 0])
        image = io.imread(img_name)
       
        ### SOME DATA MANIPULATION HERE ###

        sample = {'image': image, 'landmarks': landmarks}
        if self.transform:
            sample = self.transform(sample)

        return sample

但是,这里的代码:

        if torch.is_tensor(idx):
            idx = idx.tolist()

意味着应该能够一次检索多个项目,这让我想知道:

  1. 这种转换如何作用于多个项目?以教程中的自定义转换为例。它们看起来不像可以在一次调用中应用于一批样本。

  2. 相关,如果变换只能应用于单个样本,DataLoader 如何并行检索一批多个样本并应用所述变换?

4

2 回答 2

3
  1. 这种转换如何作用于多个项目?他们通过使用数据加载器处理多个项目。通过使用转换,您可以指定单个数据发射(例如batch_size=1)应该发生什么。数据加载器获取指定的batch_sizen调用__getitem__火炬数据集中的方法,将转换应用于发送到训练/验证的每个样本。然后它将样本整理n成从数据加载器发出的批量大小。

  2. 相关,如果变换只能应用于单个样本,DataLoader 如何并行检索一批多个样本并应用所述变换?希望以上对您有意义。并行化由 torch 数据集类和数据加载器完成,您可以在其中指定num_workers. Torch 将腌制数据集并将其传播给工作人员。

于 2021-02-25T16:31:44.740 回答
1

来自 torchvision的转换文档:

所有转换都接受 PIL Image、Tensor Image 或一批 Tensor Images 作为输入。Tensor Image 是一个具有 (C, H, W) 形状的张量,其中 C 是通道数,H 和 W 是图像的高度和宽度。Batch of Tensor Images 是 (B, C, H, W) 形状的张量,其中 B 是批次中的图像数量。应用于这批张量图像的确定性或随机变换相同地变换该批的所有图像。

这意味着您可以传递一批图像,并且变换将应用于整个批次,只要它尊重形状。列表索引作用于iloc数据帧,它选择单个索引或它们的列表,返回请求的子集。

于 2021-02-25T14:24:59.610 回答