torch.utils.data.ConcatDataset是否保留各数据集独立的torch.transforms?
ConcatDataset 中子数据集的 transforms 会被保留吗?
是的,每个子数据集的独立 transforms 会被完整保留。ConcatDataset 仅负责将多个数据集在逻辑上拼接成一个整体,不会修改任何子数据集的内部逻辑。当 DataLoader 从拼接后的数据集获取数据时,会调用对应子数据集的 __getitem__ 方法,自然会执行该子数据集自身定义的 transforms。
针对你想要的「原始图像用基础transform、增强后图像用增强transform,再合并输入网络」的需求,具体实现示例如下:
from torch.utils.data import Dataset, ConcatDataset, DataLoader from torchvision import transforms from PIL import Image import os # 自定义图像数据集类 class CustomImageDataset(Dataset): def __init__(self, data_dir, transform=None): self.image_paths = [os.path.join(data_dir, f) for f in os.listdir(data_dir) if f.endswith(('.png', '.jpg'))] self.transform = transform def __len__(self): return len(self.image_paths) def __getitem__(self, idx): image = Image.open(self.image_paths[idx]).convert('RGB') label = 0 # 示例标签,实际根据你的数据集修改 if self.transform: image = self.transform(image) return image, label # 原始数据集的基础预处理transform original_transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 增强数据集的transform(在基础上增加随机增强) augmented_transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(p=0.5), transforms.RandomRotation(15), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 创建两个独立数据集(指向同一原始数据目录,用不同transform) original_dataset = CustomImageDataset(data_dir="./your_data_dir", transform=original_transform) augmented_dataset = CustomImageDataset(data_dir="./your_data_dir", transform=augmented_transform) # 拼接两个数据集 combined_dataset = ConcatDataset([original_dataset, augmented_dataset]) # 创建DataLoader用于训练 train_loader = DataLoader(combined_dataset, batch_size=32, shuffle=True)
关键说明:
- 来自
original_dataset的图像只会执行基础预处理,augmented_dataset的图像会执行包含随机翻转、旋转的增强操作,两者逻辑完全独立。 - 需确保两个子数据集的返回格式一致(比如都返回
(图像张量, 标签)),否则拼接后DataLoader会抛出格式不匹配的错误。 - 如果你使用PyTorch内置数据集(如
ImageFolder),用法完全相同:分别创建带不同transform的数据集实例,再用ConcatDataset拼接即可。
内容的提问来源于stack exchange,提问作者Sadman Jahan
相关产品推荐
相关产品推荐

