PyTorch 的自定义数据集 class 是否应该继承自 torch.utils.data.Dataset - 为什么两者都有效?

PyTorch's custom dataset class should inherit from torch.utils.data.Dataset or not - why both work?

我在研究PyTorch的Datasetclass。据我所知,每次我们创建自己的 CustomDataset class 时,我们都需要从 torch.utils.data.Dataset 继承;此外,我们需要根据需要覆盖 __len____getitem__ 方法。

但是,我了解到并不总是需要继承,我们可以继续使用 __len____getitem__ 创建我们的 CustomDataset class没有继承自 torch.utils.data.Dataset 的方法,即便如此,自定义数据集实例的行为仍然几乎相同(我自己测试过)。

也就是说,len(cust_data) 会 return 我们在创建 cust_data 实例时传递的数据集的长度,我们甚至可以索引 cust_datacust_data[0] 并且它会 return return 在我们的 CustomDataset class.

中由 __getitem__ 方法编辑的内容

我的问题是-

  1. 当我们不继承也一样好时,继承的必要性是什么?如果不是,那么如果我们不继承,我们会错过什么功能?什么时候推荐继承,什么时候不推荐? (虽然官方文档建议继承,总是)

  2. 不继承的时候,实例是怎么知道索引时需要调用__getitem__方法的?

感谢任何答案。

  1. 看看 torch.utils.data.Datasetsource code - 它是一个抽象 class,保证每个 class 继承它 必须实施__getitem__。换句话说,您“不需要”继承 Dataset:只要正确实施 __getitem__,您的数据集 class 就可以正常工作。这样做已成为普遍做法的原因是,它向 third-party(例如,使用您的数据集 class 的其他一些代码,其他阅读您的代码的代码)表明 class 在问题已 __getitem__ 实施。它为 PyTorch 数据集提供了一个通用的接口

  2. 执行someClass[i]会自动调用带有参数isomeClass.__getitem__(如果__getitem__没有执行会抛出错误)。这是一个 Python built-in 特性,与您继承的 class 基础无关。您可以Google“双下划线”来了解有关这些特殊行为的更多信息。