Pytorch 如何洗牌数据集的标签?

Pytorch 如何洗牌数据集的标签?,pytorch,mnist,Pytorch,Mnist,我已使用以下命令下载了MNIST数据集: train_dataset = dsets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) 我现在需要在这个数据集(MNIST)上运行一些实验,但要洗牌训练集的标签。我如

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

train_dataset = dsets.MNIST(root='./data', 
                            train=True, 
                            transform=transforms.ToTensor(),
                            download=True)
我现在需要在这个数据集(MNIST)上运行一些实验,但要洗牌训练集的标签。我如何随机洗牌/重新分配它们?我尝试了以下方法:

train_dataset=dsets.MNIST(根='。/data',
火车=真的,
transform=transforms.ToTensor(),
target_transform=lambda y:torch.randint(0,10,(1,)).item(),
下载=真)
但我注意到,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)
为了在每个历元中获得新的洗牌,您需要在每个历元中重新定义标签映射、训练数据集和数据加载器

更新要生成独立于真实标签但与给定索引一致的随机标签,您可能需要非常仔细地进行种子设定或重新实现dataset类的某些功能

例如,后一种情况可能与此类似

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))]

谢谢你的回答!这里的问题是,如果我做对了,随机数取决于y。换句话说,它将所有相等的标签映射到同一个数字,例如,它将每3个标签映射到一个始终相同的随机数。我需要的是一个完全随机的洗牌。啊,我明白了,所以你想要一个独立于真实标签的随机标签?是的,那太好了:)@Alfred我更新了答案。我在手机上打字,所以还没有测试过,但想法应该很清楚。另一种方法是,在定义数据集后,只需更改
train_dataset.targets