CIFAR10 不支持切片,这就是您收到该错误的原因。如果您想要前 10 个,则必须这样做:
print([trainset[i] for i in range(10)])
更多信息
您可以索引 CIFAR10 类的实例的主要原因是该类实现了__getitem__()
功能。
所以,当你打电话时,trainset[i]
你实际上是在打电话trainset.__getitem__(i)
现在,在 python3 中,切片表达式也通过切片表达式作为切片对象__getitem__()
传递给的位置进行处理。__getitem__()
所以,trainset[2:10]
等价于trainset.__getitem__(slice(2, 10))
而且由于被传递给的两种不同类型的对象__getitem__
预计会做完全不同的事情,因此您必须明确地处理它们。
不幸的是,它不是,从__getitem__
CIFAR10 类的方法实现中可以看出:
def __getitem__(self, index):
if self.train:
img, target = self.train_data[index], self.train_labels[index]
else:
img, target = self.test_data[index], self.test_labels[index]
# doing this so that it is consistent with all other datasets
# to return a PIL Image
img = Image.fromarray(img)
if self.transform is not None:
img = self.transform(img)
if self.target_transform is not None:
target = self.target_transform(target)
return img, target