【问题标题】:AttributeError when selecting 0s and 1s from MNIST dataset with PyTorch使用 PyTorch 从 MNIST 数据集中选择 0 和 1 时出现 AttributeError
【发布时间】:2020-08-05 12:48:01
【问题描述】:

我正在按照指南构建模型,以仅在 MNIST 数据集中的 0 和 1 之间进行分类。但是,他们建议选择 0/1 值的方法对我不起作用并引发错误。 这是我正在使用的代码:

from torch.utils.data import DataLoader

mnist_train = datasets.MNIST("./data", train=True, download=True, transform=transforms.ToTensor())
mnist_test = datasets.MNIST("./data", train=False, download=True, transform=transforms.ToTensor())

train_idx = mnist_train.train_labels <= 1
mnist_train.train_data = mnist_train.train_data[train_idx]
mnist_train.train_labels = mnist_train.train_labels[train_idx]

test_idx = mnist_test.test_labels <= 1
mnist_test.test_data = mnist_test.test_data[test_idx]
mnist_test.test_labels = mnist_test.test_labels[test_idx]

train_loader = DataLoader(mnist_train, batch_size = 100, shuffle=True)
test_loader = DataLoader(mnist_test, batch_size = 100, shuffle=False)

这是我运行它时得到的输出:

  File "<ipython-input-2-aa7f63047cd9>", line 8, in <module>
    mnist_train.train_data = mnist_train.train_data[train_idx]

AttributeError: can't set attribute

我也尝试过改变:

mnist_train.train_data = mnist_train.train_data[train_idx]

作者:

try:
    mnist_train.train_data = mnist_train.train_data[train_idx]
except AttributeError:
    mnist_train._train_data = mnist_train.train_data[train_idx]

并在每条此类语句中添加额外的“_”似乎可以解决问题,但后来在尝试训练模型时,我意识到它并没有只选择 0 和 1。有什么建议吗?

【问题讨论】:

    标签: python machine-learning pytorch attributeerror mnist


    【解决方案1】:

    感谢@ptrblck 在 PyTorch 论坛中找到了解决方案(https://discuss.pytorch.org/t/how-to-use-one-class-of-number-in-mnist/26276/3):

    随着最新的 PyTorch 更新,新语法是:

    from torchvision import datasets, transforms
    from torch.utils.data import DataLoader
    
    mnist_train = datasets.MNIST("./data", train=True, download=True, transform=transforms.ToTensor())
    mnist_test = datasets.MNIST("./data", train=False, download=True, transform=transforms.ToTensor())
    
    train_idx = mnist_train.train_labels <= 1
    mnist_train.data = mnist_train.train_data[train_idx]
    mnist_train.targets = mnist_train.train_labels[train_idx]
    
    test_idx = mnist_test.test_labels <= 1
    mnist_test.data = mnist_test.test_data[test_idx]
    mnist_test.targets = mnist_test.test_labels[test_idx]
    
    train_loader = DataLoader(mnist_train, batch_size = 100, shuffle=True)
    test_loader = DataLoader(mnist_test, batch_size = 100, shuffle=False)
    

    【讨论】:

      【解决方案2】:

      对于 2021 年关注此问题的任何人,似乎应该始终使用 targets 而不是 train_labels,所以现在最好的答案应该是:

      from torchvision import datasets, transforms
      from torch.utils.data import DataLoader
      
      mnist_train = datasets.MNIST("./data", train=True, download=True, transform=transforms.ToTensor())
      mnist_test = datasets.MNIST("./data", train=False, download=True, transform=transforms.ToTensor())
      
      train_idx = mnist_train.train_labels <= 1
      mnist_train.data = mnist_train.data[train_idx]
      mnist_train.targets = mnist_train.targets[train_idx]
      
      test_idx = mnist_test.test_labels <= 1
      mnist_test.data = mnist_test.data[test_idx]
      mnist_test.targets = mnist_test.targets[test_idx]
      
      train_loader = DataLoader(mnist_train, batch_size = 100, shuffle=True)
      test_loader = DataLoader(mnist_test, batch_size = 100, shuffle=False)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-17
        • 2018-07-06
        • 2022-01-01
        • 2018-09-11
        • 2019-05-04
        • 1970-01-01
        • 1970-01-01
        • 2021-01-12
        相关资源
        最近更新 更多