【问题标题】:Get file names and file path using PyTorch dataloader使用 PyTorch 数据加载器获取文件名和文件路径
【发布时间】:2021-06-24 08:47:49
【问题描述】:

我正在使用 PyTorch 1.8 和 Python 3.8 使用以下代码从文件夹中读取图像:

print(f"PyTorch version: {torch.__version__}")
# PyTorch version: 1.8.1

# Device configuration-
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"currently available device: {device}")
# currently available device: cpu


# Define transformations for training and test sets-
transform_train = transforms.Compose(
    [
      # transforms.RandomCrop(32, padding = 4),
      # transforms.RandomHorizontalFlip(),
      transforms.ToTensor(),
      # transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
     ]
     )

transform_test = transforms.Compose(
    [
      transforms.ToTensor(),
      # transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
     ]
     )

# Define directory containing images-
data_dir = 'My_Datasets/Cat_Dog_data/'

# Define datasets-
train_data = datasets.ImageFolder(data_dir + '/train', 
                                  transform = train_transforms)
test_data = datasets.ImageFolder(data_dir + '/test', 
                                 transform = test_transforms)

print(f"number of train images = {len(train_data)} & number of validation images = {len(test_data)}")
# number of train images = 22500 & number of validation images = 2500

print(f"number of training classes = {len(train_data.classes)} & number of validation classes = {len(test_data.classes)}")
# number of training classes = 2 & number of validation classes = 2

# Define data loaders-
trainloader = torch.utils.data.DataLoader(train_data, batch_size = 32)
testloader = torch.utils.data.DataLoader(test_data, batch_size = 32)

len(trainloader), len(testloader)
# (704, 79)

# Sanity check-
len(train_data) / 32, len(test_data) / 32

您可以使用 'train_loader' 遍历训练数据,如下所示:

for img, lab in train_loader:
   print(img.shape, lab.shape)
   pass

但是,我有兴趣获取文件名以及从中读取文件的文件路径。我怎样才能做到这一点?

谢谢!

【问题讨论】:

    标签: pytorch python-3.8


    【解决方案1】:

    默认ImageFolderDataset保存self.samples中所有图片的路径。您需要做的就是修改__getitem__ 以返回路径。

    【讨论】:

    • 用于存储在本地系统中的图像数据集。上面的编辑代码
    • sample_fnames, label = dataloaders_dict['test'].dataset.samples[i] 只给我 110 个文件名,这是我的“图像数量/批量大小 = 512”。如何在测试加载器中获取所有图像的名称? stackoverflow.com/questions/71430015/…
    【解决方案2】:

    如果您能向我们展示您是如何实现数据加载器的,那将会很有用。

    如果不可能, 您可以按照这 2 个指南来帮助您了解如何自定义您在 _getitem_ 中返回的数据:

    参考1:Multi-Class Classification Using PyTorch: Preparing Data (check Page 2 to see how _getitem_ is defined)

    参考2:Multi-Class Classification Using PyTorch: Training (check Page 2 to see how to use it)

    我要做的是将路径和文件名的相应值添加到这个字典(取自参考文献 1)中。

    (根据参考文献 1 修改)

    def __getitem__(self, idx):
    
      path = self.path[idx]
      fileName = self.fileName[idx]
      preds = self.x_data[idx]
      trgts = self.y_data[idx]
    
      sample = { 
        'predictors' : preds,
        'targets' : trgts,
        'path': path,
        'fileName': fileName
      }
      return sample
    

    所以,当你想在模型训练实现中获取它的值时,只需使用 key 来获取这些值。

    (根据参考文献 2 修改)

    for (batch_idx, batch) in enumerate(train_ldr):
    
        X = batch['predictors']   
        Y = batch['targets']
        path = batch['path']
        fileName = batch['fileName']
    
        optimizer.zero_grad()
        oupt = net(X)
        # .....
    

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2012-02-08
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2023-03-26
      • 2011-11-16
      • 2013-12-08
      • 2015-11-21
      相关资源
      最近更新 更多