python - 仅增强 K 折交叉验证中的训练集

标签 python deep-learning pytorch

我正在尝试为不平衡数据集(类 0 = 4000 个图像,类 1 = 大约 250 个图像)创建一个二元 CNN 分类器,我想对其执行 5 倍交叉验证。目前,我正在将训练集加载到 ImageLoader 中,该 ImageLoader 应用我的转换/增强(?)并将其加载到 DataLoader 中。但是,这会导致我的训练分割和验证分割都包含增强数据。

我最初应用离线转换(离线增强?)来平衡我的数据集,但从这个线程( https://stats.stackexchange.com/questions/175504/how-to-do-data-augmentation-and-train-validate-split )来看,仅增强训练集似乎是理想的。我还希望仅在增强训练数据上训练我的模型,然后在 5 倍交叉验证中在非增强数据上进行验证

我的数据组织为 root/label/images,其中有 2 个标签文件夹(0 和 1),图像分类到各自的标签中。

到目前为止我的代码

total_set = datasets.ImageFolder(ROOT, transform = data_transforms['my_transforms'])

//Eventually I plan to run cross-validation as such:
splits = KFold(cv = 5, shuffle = True, random_state = 42)

for train_idx, valid_idx in splits.split(total_set):
    train_sampler = SubsetRandomSampler(train_idx)
    valid_sampler = SubsetRandomSampler(valid_idx)

    train_loader = torch.utils.data.DataLoader(total_set, batch_size=32, sampler=train_sampler)
    val_loader = torch.utils.data.DataLoader(total_set, batch_size=32, sampler=valid_sampler)

model.train()
//Model train/eval works but may be overpredict 

我确信我在这段代码中做了一些次优或错误的事情,但我似乎找不到任何关于专门增强交叉验证中的训练分割的文档!

如有任何帮助,我们将不胜感激!

最佳答案

一种方法是实现一个包装器 Dataset 类,该类将转换应用于 ImageFolder 数据集的输出。例如

class WrapperDataset:
    def __init__(self, dataset, transform=None, target_transform=None):
        self.dataset = dataset
        self.transform = transform
        self.target_transform = target_transform

    def __getitem__(self, index):
        image, label = self.dataset[index]
        if self.transform is not None:
            image = self.transform(image)
        if self.target_transform is not None:
            label = self.target_transform(label)
        return image, label

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

然后您可以通过使用不同的转换包装更大的数据集来在代码中使用它。

total_set = datasets.ImageFolder(ROOT)

# Eventually I plan to run cross-validation as such:
splits = KFold(cv = 5, shuffle = True, random_state = 42)

for train_idx, valid_idx in splits.split(total_set):
    train_sampler = SubsetRandomSampler(train_idx)
    valid_sampler = SubsetRandomSampler(valid_idx)

    train_loader = torch.utils.data.DataLoader(
        WrapperDataset(total_set, transform=data_transforms['train_transforms']),
        batch_size=32, sampler=train_sampler)
    valid_loader = torch.utils.data.DataLoader(
        WrapperDataset(total_set, transform=data_transforms['valid_transforms']),
        batch_size=32, sampler=valid_sampler)

    # train/validate now

我没有测试过这段代码,因为我没有完整的代码/模型,但概念应该很清楚。

关于python - 仅增强 K 折交叉验证中的训练集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57539567/

相关文章:

deep-learning - resnet 有全连接层吗?

python - Keras 合并层警告

python - 如何在 Huggingface 模型中获得 token 的概率分布?

python - 如何安装带有 .whl 文件的 Python 包?

python - 在 Python 中安全处理密码?

python - 陷入 django 迁移 IntegrityError 循环 : can I delete those migrations that aren't yet in the db?

Python、Pandas : Use the GroupBy. 组描述以将其应用于另一个分组

machine-learning - 如何在 mxnet.gluon 中定义每层学习率?

python - 我的 PyTorch 模型中不同层的名称是什么?

pytorch - 谷歌 Colab : torch cuda is true but No CUDA GPUs are available