Pytorch 在ImageNet中使用类的子集

Pytorch 在ImageNet中使用类的子集,pytorch,Pytorch,我知道ImageNet的子集是存在的,但是它们不能满足我的要求。我想要50个以其本机ImageNet分辨率的类 为此,我使用torch.utils.data.dataset.Subset从ImageNet中选择特定的类。然而,事实证明,类标签/索引必须大于0且小于num\u classes 因为ImageNet包含1000个类,所以我选择的类的idx很快超过50个。我如何重新分配等级指数,并以允许以后进行评估的方式进行分配 有没有更优雅的方法来选择子集?我不确定我是否理解您关于标签大于零且小于n

我知道ImageNet的子集是存在的,但是它们不能满足我的要求。我想要50个以其本机ImageNet分辨率的类

为此,我使用
torch.utils.data.dataset.Subset
从ImageNet中选择特定的类。然而,事实证明,类标签/索引必须大于0且小于
num\u classes

因为ImageNet包含1000个类,所以我选择的类的idx很快超过50个。我如何重新分配等级指数,并以允许以后进行评估的方式进行分配


有没有更优雅的方法来选择子集?

我不确定我是否理解您关于标签大于零且小于
num\u类的结论。助手接收一个
torch.utils.data.Dataset
和一系列索引,它们对应于要保留在子集中的
Dataset
中的数据点索引。这些指数与它们所属的类别无关

以下是我的做法:

  • 通过加载数据集(自定义数据集的工作方式相同)。在这里,我将向FashionList演示,因为ImageNet的数据不是通过torchvision的API直接提供的

    >>> ds = torchvision.datasets.FashionMNIST('.')
    >>> len(ds)
    60000
    
  • 定义要为子集数据集选择的类。并从主数据集中检索与这些类对应的所有索引:

    >>> targets = [1, 3, 5, 9]
    >>> indices = [i for i, label in enumerate(ds.targets) if label in targets]
    
  • 您有自己的子集:

    >>> ds_subset = Subset(ds, indices)
    >>> len(ds_subset)
    24000
    
  • 此时,您可以使用字典使用
    目标重新映射标签:

    >>> remap = {i:x for i, x in enumerate(targets)}
    {0: 1, 1: 3, 2: 5, 3: 9}
    
    例如:

    >>> x, y = ds_subset[10]
    >>> y, remap[y] # old_label, new_label
    1, 3
    

  • 我不确定我是否理解您关于标签大于零且小于
    num\u类
    的结论。助手接收一个
    torch.utils.data.Dataset
    和一系列索引,它们对应于要保留在子集中的
    Dataset
    中的数据点索引。这些指数与它们所属的类别无关

    以下是我的做法:

  • 通过加载数据集(自定义数据集的工作方式相同)。在这里,我将向FashionList演示,因为ImageNet的数据不是通过torchvision的API直接提供的

    >>> ds = torchvision.datasets.FashionMNIST('.')
    >>> len(ds)
    60000
    
  • 定义要为子集数据集选择的类。并从主数据集中检索与这些类对应的所有索引:

    >>> targets = [1, 3, 5, 9]
    >>> indices = [i for i, label in enumerate(ds.targets) if label in targets]
    
  • 您有自己的子集:

    >>> ds_subset = Subset(ds, indices)
    >>> len(ds_subset)
    24000
    
  • 此时,您可以使用字典使用
    目标重新映射标签:

    >>> remap = {i:x for i, x in enumerate(targets)}
    {0: 1, 1: 3, 2: 5, 3: 9}
    
    例如:

    >>> x, y = ds_subset[10]
    >>> y, remap[y] # old_label, new_label
    1, 3