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