如何打乱数据集的标签?

How can I shuffle the labels of a dataset?

我已经使用以下命令下载了 MNIST 数据集:

train_dataset = dsets.MNIST(root='./data', 
                            train=True, 
                            transform=transforms.ToTensor(),
                            download=True)

我现在需要 运行 在此数据集 (MNIST) 上进行一些实验,但要打乱训练集的标签。我怎样才能随机 shuffle/reassign 它们?我尝试了以下方法:

train_dataset = dsets.MNIST(root='./data', 
                            train=True, 
                            transform=transforms.ToTensor(),
                            target_transform=lambda y: torch.randint(0, 10, (1,)).item(),
                            download=True)

但我注意到,在 lambda 函数之后发生的事情会使标签在训练过程中打乱,例如他们在每个时代都在变化。这样,我就不会达到 100% 的训练准确率,这正是我的目标。如何以完全随机的方式打乱这些标签,确保这些标签在训练过程中不会改变?

谢谢!!

如果您的目标是创建标签的随机映射,您需要在定义目标转换之前定义映射以保持转换不变。像下面这样的东西应该可以解决问题

import random
label_mapping = list(range(10))
random.shuffle(label_mapping)
train_dataset = dsets.MNIST(root='./data', 
                            train=True, 
                            transform=transforms.ToTensor(),
                            target_transform=lambda y: label_mapping[y],
                            download=True)

为了在每个时期获得新的洗牌,您需要在每个时期重新定义标签映射、训练数据集和数据加载器。

更新 要生成一个独立于真实标签但与给定索引一致的随机标签,那么您可能需要做一些非常仔细的播种或重新实现一些功能数据集 class.

例如,后一种情况可能看起来像这样

import random
class RandomMNIST(dsets.MNIST):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.targets = [random.randint(0, 9) for _ in range(len(self.data))]

train_dataset = RandomMNIST(root='./data', 
                            train=True, 
                            transform=transforms.ToTensor(),
                            download=True)

或等效

import random
train_dataset = dsets.MNIST(root='./data', 
                            train=True, 
                            transform=transforms.ToTensor(),
                            download=True)
train_dataset.targets = [random.randint(0, 9) for _ in range(len(train_dataset))]