英文:
Return multiple images from a custom dataset
问题
我有一组从YouTube视频中获取的帧的袋子,并希望在迭代数据集时返回整个帧袋。我的自定义数据集类如下:
dataset_path = Path('/content/VideoClassificationDataset')
class VideoDataset(Dataset):
def __init__(self, dictionary, transform = None):
self.l_dict = list(dictionary.items())
self.transform = transform
def __len__(self):
return len(self.l_dict)
def __get_item__(self, index):
item = self.l_dict[index]
images_path = item[0]
images = [Image.open(f'{dataset_path}/{images_path}/{image}') for image in os.listdir(f'{dataset_path}/{images_path}')]
y_labels = torch.tensor(item[1])
if self.transform:
for image in images: self.transform(image)
return images, y_labels
此外,我还完成了以下操作:
def spit_train(train_data, perc_val_size):
train_size = len(train_data)
val_size = int((train_size * perc_val_size) // 100)
train_size -= val_size
return random_split(train_data, [int(train_size), int(val_size)])
train_data, val_data = spit_train(VideoDataset(train_dict, transform=train_transform()), 20)
test_data = VideoDataset(dictionary=test_dict, transform=test_transform())
BATCH_SIZE = 16
NUM_WORKERS = os.cpu_count()
def generate_dataloaders(train_data, test_data, batch_size=BATCH_SIZE, num_workers=NUM_WORKERS):
train_dl = DataLoader(dataset = train_data,
batch_size = BATCH_SIZE,
num_workers = NUM_WORKERS,
shuffle = True)
val_dl = DataLoader dataset = val_data,
batch_size = BATCH_SIZE,
num_workers = NUM_WORKERS,
shuffle = True)
test_dl = DataLoader(dataset = test_data,
batch_size = BATCH_SIZE,
num_workers = NUM_WORKERS,
shuffle = False)
return train_dl, val_dl, test_dl
train_dl, val_dl, test_dl = generate_dataloaders(train_data, test_data)
train_dict 和 test_dict 是包含每个帧袋的路径作为键和标签列表作为值的字典,如下所示:
{'train/iqGq-8vHEJs/bag_of_shots0': [2],
'train/iqGq-8vHEJs/bag_of_shots1': [2],
'train/gnw83R8R6jU/bag_of_shots0': [119],
'train/gnw83R8R6jU/bag_of_shots1': [119],
...
}
问题出在当我尝试查看数据加载器包含的内容时:
train_features_batch, train_labels_batch = next(iter(train_dl))
print(train_features_batch.shape, train_labels_batch.shape)
val_features_batch, val_labels_batch = next(iter(val_dl))
print(val_features_batch.shape, val_labels_batch.shape)
我得到了以下错误:
NotImplementedError: DataLoader worker process 0 中发生了 NotImplementedError。
原始跟踪信息(最近的调用最先)如下所示:
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/worker.py", line 302, in _worker_loop
data = fetcher.fetch(index)
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/fetch.py", line 58, in fetch
data = [self.dataset[idx] for idx in possibly_batched_index]
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/fetch.py", line 58, in <listcomp>
data = [self.dataset[idx] for idx in possibly_batched_index]
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/dataset.py", line 295, in __getitem__
return self.dataset[self.indices[idx]]
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/dataset.py", line 53, in __getitem__
raise NotImplementedError
NotImplementedError
在这一点上,我不确定是否可以在我的 __get_item__() 函数中返回一组图像。
英文:
I have a set of bags of frames obtained from YouTube videos and I would like to return an entire bag when I iterate my dataset. My custom dataset class is the following one:
dataset_path = Path('/content/VideoClassificationDataset')
class VideoDataset(Dataset):
def __init__(self, dictionary, transform = None):
self.l_dict = list(dictionary.items())
self.transform = transform
def __len__(self):
return len(self.l_dict)
def __get_item__(self, index):
item = self.l_dict[index]
images_path = item[0]
images = [Image.open(f'{dataset_path}/{images_path}/{image}') for image in os.listdir(f'{dataset_path}/{images_path}')]
y_labels = torch.tensor(item[1])
if self.transform:
for image in images: self.transform(image)
return images, y_labels
Moreover I’ve done also
def spit_train(train_data, perc_val_size):
train_size = len(train_data)
val_size = int((train_size * perc_val_size) // 100)
train_size -= val_size
return random_split(train_data, [int(train_size), int(val_size)])
train_data, val_data = spit_train(VideoDataset(train_dict, transform=train_transform()), 20)
test_data = VideoDataset(dictionary=test_dict, transform=test_transform())
BATCH_SIZE = 16
NUM_WORKERS = os.cpu_count()
def generate_dataloaders(train_data, test_data, batch_size=BATCH_SIZE, num_workers=NUM_WORKERS):
train_dl = DataLoader(dataset = train_data,
batch_size = BATCH_SIZE,
num_workers = NUM_WORKERS,
shuffle = True)
val_dl = DataLoader(dataset = val_data,
batch_size = BATCH_SIZE,
num_workers = NUM_WORKERS,
shuffle = True)
test_dl = DataLoader(dataset = test_data,
batch_size = BATCH_SIZE,
num_workers = NUM_WORKERS,
shuffle = False) # don't need to shuffle testing data when we are considering time series dataset
return train_dl, val_dl, test_dl
train_dl, val_dl, test_dl = generate_dataloaders(train_data, test_data)
The train_dict and test_dict are dictionaries that contains the path of each bag of shots as key and the list of labels as value, like so:
{'train/iqGq-8vHEJs/bag_of_shots0': [2],
'train/iqGq-8vHEJs/bag_of_shots1': [2],
'train/gnw83R8R6jU/bag_of_shots0': [119],
'train/gnw83R8R6jU/bag_of_shots1': [119],
...
}
The point is that when I try to see what the dataloader contains:
train_features_batch, train_labels_batch = next(iter(train_dl))
print(train_features_batch.shape, train_labels_batch.shape)
val_features_batch, val_labels_batch = next(iter(val_dl))
print(val_features_batch.shape, val_labels_batch.shape)
I get:
NotImplementedError: Caught NotImplementedError in DataLoader worker process 0.
Original Traceback (most recent call last):
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/worker.py", line 302, in _worker_loop
data = fetcher.fetch(index)
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/fetch.py", line 58, in fetch
data = [self.dataset[idx] for idx in possibly_batched_index]
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/fetch.py", line 58, in <listcomp>
data = [self.dataset[idx] for idx in possibly_batched_index]
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/dataset.py", line 295, in __getitem__
return self.dataset[self.indices[idx]]
File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/dataset.py", line 53, in __getitem__
raise NotImplementedError
NotImplementedError
I’m not particularly sure If I can return a set of images in my get_item() function at this point.
答案1
得分: 2
函数名中有拼写错误,应该是__getitem__,而不是__get_item__。
由于在您的自定义数据集类中未定义此函数,因此会使用基类(torch.utils.data.Dataset)中的函数,但该基类中并没有实现此功能,因为每个从该类继承的数据集都需要自行实现该功能。因此会出现NotImplementedError。
关于此问题的更多文档可以在这里找到。
英文:
There is a typo in the function name, instead of __get_item__, the name should be __getitem__.
Since this is not defined in your custom dataset class, the function from the base class (torch.utils.data.Dataset) is used, which doesn't implement this since it needs to be implemented by each dataset that inherits from this class. So you get an NotImplementedError.
More documentation on this can be found here.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论