You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:55:17