Результаты разделения проверки поезда в нулевых выборках для некоторых классов в наборе данных PyTorchPython

Программы на Python
Anonymous
Результаты разделения проверки поезда в нулевых выборках для некоторых классов в наборе данных PyTorch

Сообщение Anonymous »

Я работаю над классификацией изображений с помощью PyTorch. Мой набор данных находится в формате каталога. Я настроил свой конвейер данных и модель. Тем не менее, я столкнулся с проблемой в моем разделении проверки поездов, когда некоторые классы имеют нулевые выборки ни в наборах данных обучения, ни в наборах данных проверки. Вот соответствующая часть моего кода и настройки:

Код: Выделить всё

class CustomDataset(Dataset):
def __init__(self, root_dir, transform=None):
self.root_dir = root_dir
self.transform = transform
self.classes = os.listdir(root_dir)
self.image_paths = []
self.labels = []

for label, class_name in enumerate(self.classes):
class_dir = os.path.join(root_dir, class_name)
for img_path in glob.glob(os.path.join(class_dir, '*.png')) + \
glob.glob(os.path.join(class_dir, '*.jpg')) + \
glob.glob(os.path.join(class_dir, '*.jpeg')):
self.image_paths.append(img_path)
self.labels.append(label)

def __len__(self):
return len(self.image_paths)

def __getitem__(self, idx):
img_path = self.image_paths[idx]
image = Image.open(img_path).convert('RGB')
label = self.labels[idx]

if self.transform:
image = self.transform(image)
else:
image = transforms.ToTensor()(image)  # Convert PIL image to tensor if no transform is provided

return image, label

Код: Выделить всё

class AugmentedDataset(Dataset):
def __init__(self, base_dataset, transforms_list):
self.base_dataset = base_dataset
self.transforms_list = transforms_list if isinstance(transforms_list, list) else [transforms_list]

def __len__(self):
return len(self.base_dataset) * len(self.transforms_list)

def __getitem__(self, idx):
base_idx = idx // len(self.transforms_list)
transform_idx = idx % len(self.transforms_list)

image, label = self.base_dataset[base_idx]
transform = self.transforms_list[transform_idx]

if transform:
image = transform(image)

return image, label
Разделение теста

Код: Выделить всё

base_dataset = CustomDataset(train_dir, v2.Compose(basic_transformations))

train_size = int(0.8 * len(base_dataset))
val_size = len(base_dataset) - train_size

train_base_dataset, val_dataset = random_split(base_dataset, [train_size, val_size])
train_dataset = AugmentedDataset(train_base_dataset, augmentations)
val_dataset = AugmentedDataset(train_base_dataset, v2.Compose(final_transformation))

trainloader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
valloader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False)
После выполнения разделения я заметил, что некоторые классы имеют нулевые выборки ни в обучающем, ни в проверочном наборе данных.
  • Почему это происходит с методом pytorchrandom_split?
  • Каковы наилучшие методы обеспечения сбалансированного разделения по всем классам как в обучающем, так и в проверочном наборе?
  • br />Есть ли какие-либо конкретные методы или библиотеки, которые я могу использовать для поддержания баланса классов во время разделения?
Вот мой блокнот: EfficientNet с Аугментация

Подробнее здесь: https://stackoverflow.com/questions/788 ... orch-datas

Вернуться в «Python»