В случае, если ваша цель состоит в том, чтобы создать случайное отображение меток, вам нужно определить это отображение перед определением целевого преобразования, чтобы сохранить его постоянным. Что-то вроде следующего должно сделать трюк
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)
Для того, чтобы получить новую случайную смену в каждой эпохе, вы захотите переопределить отображение меток, набор обучающих данных и загрузчик данных для каждой эпохи.
Обновление Чтобы вместо этого сгенерировать случайную метку, которая не зависит от истинной метки, но совместима с данным индексом, вам, вероятно, нужно либо выполнить очень тщательное заполнение, либо переопределить некоторые функции класса набора данных.
Например, последний случай может выглядеть примерно так:
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))]