【问题标题】:Subclass of PyTorch dataset class cannot find dataset filesPyTorch 数据集类的子类找不到数据集文件
【发布时间】:2021-09-04 10:27:38
【问题描述】:

我正在尝试创建 PyTorch MNIST 数据集类的子类,我称之为 CustomMNISTDataset,如下所示:

import torchvision.datasets as datasets

class CustomMNISTDataset(datasets.MNIST):

    def __init__(self, root='/home/psando'):
        super().__init__(root=root,
                         download=False)

但是当我执行时:

dataset = CustomMNISTDataset()

失败并出现错误:“RuntimeError: Dataset not found. You can use download=True to download it”。

但是,当我在同一个文件中运行以下命令时:

dataset = datasets.MNIST(root='/home/psando', download=False)
print(len(dataset))

成功并按预期打印“60000”。

由于CustomMNISTDataset 子类datasets.MNIST 为什么行为不同?我已经验证路径“/home/psando”包含带有原始和已处理子目录的 MNIST 目录(否则,显式调用datasets.MNIST() 的构造函数会失败)。当前的行为意味着在CustomMNISTDataset 中对super().__init__() 的调用并未调用datasets.MNIST 的构造函数,这很奇怪!

其他细节:我使用 Python 3.6.8 和 torch==1.6.0torchvision==0.7.0。任何帮助将不胜感激!

【问题讨论】:

  • 你试过download='True'吗?
  • 根据文档,download 应该是一个布尔值,而不是一个字符串。但是让我在CustomMNISTDataset 中创建download=True,看看它把下载的文件放在哪里...
  • 即使在 download = "True" 的情况下也可以使用

标签: python python-3.x constructor pytorch subclass


【解决方案1】:

这需要一些来源潜水,但你的问题是this 函数。数据集的路径取决于类的名称,因此当您将MNIST 子类化时,根文件夹将更改为/home/psando/CustomMNISTDataset

因此,如果您将 /home/psando/MNIST 重命名为 /home/psando/CustomMNISTDataset,它会起作用。

【讨论】:

  • 我明白了!是的,我刚刚在CustomMNISTDataset 中更改了download=True,我注意到它正在下载到/home/psando/CustomMNISTDataset。我的印象是它总是在作为参数传递的根目录中寻找MNIST/ 目录。感谢您在源代码中链接相关行!
  • 不鼓励以这种方式对数据集类进行子类化吗?
  • 不是真的,这只是意味着root 参数并不完全符合您的预期。记住命名,这样你就不会得到一堆数据集的副本:)
猜你喜欢
  • 2012-05-12
  • 2018-05-06
  • 2018-12-22
  • 2019-02-27
  • 2022-07-18
  • 2019-08-05
  • 2020-09-30
  • 1970-01-01
  • 2020-10-20
相关资源
最近更新 更多