【问题标题】:How to convert dataset of images to tensor?如何将图像数据集转换为张量?
【发布时间】:2021-01-06 10:50:28
【问题描述】:

我有一个图像数据集,如下所示:

array([[[[0.35980392, 0.26078431, 0.14313725],
     [0.38137255, 0.26470588, 0.15196078],
     [0.51960784, 0.3745098 , 0.26176471],
     ...,
     [0.34313725, 0.22352941, 0.15      ],
     [0.30784314, 0.2254902 , 0.15686275],
     [0.28823529, 0.22843137, 0.16862745]],

    [[0.38627451, 0.28235294, 0.16764706],
     [0.45098039, 0.32843137, 0.21666667],
     [0.62254902, 0.47254902, 0.36470588],
     ...,
     [0.34607843, 0.22745098, 0.15490196],
     [0.30686275, 0.2245098 , 0.15588235],
     [0.27843137, 0.21960784, 0.16176471]],

    [[0.41568627, 0.30098039, 0.18431373],
     [0.51862745, 0.38529412, 0.27352941],
     [0.67745098, 0.52058824, 0.40980392],
     ...,
     [0.34901961, 0.22941176, 0.15588235],
     [0.29901961, 0.21666667, 0.14901961],
     [0.26078431, 0.20098039, 0.14313725]],

    ...,

我需要将它转换为张量,以便我可以将它传递给 CNN。 我正在尝试这样做:

from torchvision import transforms as transforms
transform = transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ])

如何将此transform 应用于我的数据集?感谢您的帮助。

【问题讨论】:

    标签: pytorch conv-neural-network


    【解决方案1】:

    您可能想要创建一个数据加载器。您将需要一个遍历数据集的类,您可以这样做:

    import torch
    import torchvision.transforms
    
    class YourDataset(torch.utils.data.Dataset):
        def __init__(self):
    
           # load your dataset (how every you want, this example has the dataset stored in a json file
            with open(<dataset-path>, "r") as f:
                self.dataset = json.load(f)
    
        def __getitem__(self, idx):
            sample = self.dataset[idx]
            data, label = sample[0], sample[1]
            
            transform = transforms.Compose([
                transforms.ToTensor(),
                transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
            ])
            return transform(data), torch.tensor(label)
    
        def __len__(self):
            return len(self.dataset)
    

    现在你可以创建一个数据加载器了:

    
    train_set = YourDataset()
    
    train_dataloader = torch.utils.data.DataLoader(
                train_set,
                batch_size=64,
                num_workers=1,
                shuffle=True,
            )
    

    现在您可以在训练循环中迭代数据加载器:

    for samples, labels in self.train_set:
        . . . 
        # samples will hold N samples of your dataset where N is the batchsize
    

    如果您需要更多解释,请查看this topic 上的 pytorchs 文档。

    【讨论】:

      【解决方案2】:

      初始化后,可以在 PIL 图像或torch.Tensor 上调用torchvision 转换,具体取决于转换(在documentation 中,您可以准确找到给定转换的预期内容)。因此,假设您的转换管道是有效的(每个转换的输出类型与后续转换的输入类型兼容),那么您可以简单地调用它:transform(data)

      这应该适用于您的数据,因为 transforms.ToTensor 可以接受 numpy.ndarray 作为输入


      或者,如果您的数据集比简单的 NumPy 数组稍微复杂一点。您可以实现自己的 Dataset 类,该类将处理:在文件系统中获取图像、执行相关转换等......这是一个粗略的指导方针:

      class MyDataset(Dataset):
          def __init__(self):
              super(MyDataset, self).__init__()
      
              # define your data for example a list of images
              self.data = ...
      
              # define your transform pipline
              transform = transforms.Compose([
                  transforms.ToTensor(),
                  transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
              ])
      
          def __getitem__(self, index):
              path = self.data[index]
              img = Image.open(path)
              return self.transform(x)
      

      其中Image 是从PIL 导入的


      不过,对于你的情况,你会得到一些更简单的东西:

      class MyDataset(Dataset):
          def __init__(self, data):
              super(MyDataset, self).__init__()
      
              self.data = data
      
              # define your transform pipline
              transform = transforms.Compose([
                  transforms.ToTensor(),
                  transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
              ])
      
          def __getitem__(self, index):
              x = self.data[index]
              return self.transform(x)
      

      然后你会将你的numpy.ndarray 传递给MyDataset 的初始化器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-27
        • 2018-12-14
        • 2020-12-21
        • 2021-05-25
        • 2020-08-28
        • 1970-01-01
        • 2020-06-13
        • 1970-01-01
        相关资源
        最近更新 更多