【问题标题】:How can I randomly shuffle the labels of a Pytorch Dataset?如何随机打乱 Pytorch 数据集的标签?
【发布时间】:2019-12-05 12:01:57
【问题描述】:

我是 Pytorch 的新手,在一些技术问题上遇到了麻烦。我已经使用以下命令下载了 MNIST 数据集:

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

我现在需要在这个数据集上运行一些实验,但使用随机标签。如何随机洗牌/重新分配它们?

我正在尝试手动操作,但它告诉我“'tuple' 对象不支持项目分配”。那我该怎么办?

第二个问题:如何从数据集中删除训练点?当我尝试这样做时,它给了我同样的错误。

谢谢!!

【问题讨论】:

  • “移除训练点”是什么意思?
  • 我不想训练 60,000 个元素,而是想训练 59,999 个元素并保持最后一个元素不训练

标签: machine-learning computer-vision dataset pytorch


【解决方案1】:

如果你只想打乱目标,你可以使用target_transform 参数。例如:

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

如果您想对数据集进行更精细的调整, 你可以完全包装mnist

class MyTwistedMNIST(torch.utils.data.Dataset):
  def __init__(self, my_args):
    super(MyTwistedMNIST, self).__init__()
    self.orig_mnist = dset.MNIST(...)  

  def __getitem__(self, index):
    x, y = self.orig_mnist[index]  # get the original item
    my_x = # change input digit image x ?
    my_y = # change the original label y ?
    return my_x, my_y

  def __len__(self):
    return self.orig_mnist.__len__()

如果您想要完全丢弃原始 mnist 的元素,而不是通过环绕原始 mnist,您的 MyTwistedMNIST 类可以返回小于 self.orig_mnist.__len__()len 反映您想要的实际 mnist 示例的数量处理。此外,您需要将示例的新 index 映射到原始 mnist 索引。

【讨论】:

    猜你喜欢
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多