PyTorch 的自定义数据集 class 是否应该继承自 torch.utils.data.Dataset - 为什么两者都有效?
PyTorch's custom dataset class should inherit from torch.utils.data.Dataset or not - why both work?
我在研究PyTorch的Dataset
class。据我所知,每次我们创建自己的 CustomDataset
class 时,我们都需要从 torch.utils.data.Dataset
继承;此外,我们需要根据需要覆盖 __len__
和 __getitem__
方法。
但是,我了解到并不总是需要继承,我们可以继续使用 __len__
和 __getitem__
创建我们的 CustomDataset
class没有继承自 torch.utils.data.Dataset
的方法,即便如此,自定义数据集实例的行为仍然几乎相同(我自己测试过)。
也就是说,len(cust_data) 会 return 我们在创建 cust_data
实例时传递的数据集的长度,我们甚至可以索引 cust_data
像 cust_data[0]
并且它会 return return 在我们的 CustomDataset
class.
中由 __getitem__
方法编辑的内容
我的问题是-
当我们不继承也一样好时,继承的必要性是什么?如果不是,那么如果我们不继承,我们会错过什么功能?什么时候推荐继承,什么时候不推荐? (虽然官方文档建议继承,总是)
不继承的时候,实例是怎么知道索引时需要调用__getitem__
方法的?
感谢任何答案。
看看 torch.utils.data.Dataset
的 source code - 它是一个抽象 class,保证每个 class 继承它 必须实施__getitem__
。换句话说,您“不需要”继承 Dataset
:只要正确实施 __getitem__
,您的数据集 class 就可以正常工作。这样做已成为普遍做法的原因是,它向 third-party(例如,使用您的数据集 class 的其他一些代码,其他阅读您的代码的代码)表明 class 在问题已 __getitem__
实施。它为 PyTorch 数据集提供了一个通用的接口。
执行someClass[i]
会自动调用带有参数i
的someClass.__getitem__
(如果__getitem__
没有执行会抛出错误)。这是一个 Python built-in 特性,与您继承的 class 基础无关。您可以Google“双下划线”来了解有关这些特殊行为的更多信息。
我在研究PyTorch的Dataset
class。据我所知,每次我们创建自己的 CustomDataset
class 时,我们都需要从 torch.utils.data.Dataset
继承;此外,我们需要根据需要覆盖 __len__
和 __getitem__
方法。
但是,我了解到并不总是需要继承,我们可以继续使用 __len__
和 __getitem__
创建我们的 CustomDataset
class没有继承自 torch.utils.data.Dataset
的方法,即便如此,自定义数据集实例的行为仍然几乎相同(我自己测试过)。
也就是说,len(cust_data) 会 return 我们在创建 cust_data
实例时传递的数据集的长度,我们甚至可以索引 cust_data
像 cust_data[0]
并且它会 return return 在我们的 CustomDataset
class.
__getitem__
方法编辑的内容
我的问题是-
当我们不继承也一样好时,继承的必要性是什么?如果不是,那么如果我们不继承,我们会错过什么功能?什么时候推荐继承,什么时候不推荐? (虽然官方文档建议继承,总是)
不继承的时候,实例是怎么知道索引时需要调用
__getitem__
方法的?
感谢任何答案。
看看
torch.utils.data.Dataset
的 source code - 它是一个抽象 class,保证每个 class 继承它 必须实施__getitem__
。换句话说,您“不需要”继承Dataset
:只要正确实施__getitem__
,您的数据集 class 就可以正常工作。这样做已成为普遍做法的原因是,它向 third-party(例如,使用您的数据集 class 的其他一些代码,其他阅读您的代码的代码)表明 class 在问题已__getitem__
实施。它为 PyTorch 数据集提供了一个通用的接口。执行
someClass[i]
会自动调用带有参数i
的someClass.__getitem__
(如果__getitem__
没有执行会抛出错误)。这是一个 Python built-in 特性,与您继承的 class 基础无关。您可以Google“双下划线”来了解有关这些特殊行为的更多信息。