【问题标题】:TypeError: 'tuple' object cannot be interpreted as an integer while creating data generators PyTorchTypeError:“元组”对象在创建数据生成器 PyTorch 时不能解释为整数
【发布时间】:2020-02-12 15:38:49
【问题描述】:

我是 PyTorch 的新手,我正在学习创建批量数据以进行分割。代码如下:

class NumbersDataset(Dataset):
    def __init__(self):
        self.X = list(df['input_img'])
        self.y = list(df['mask_img'])

    def __len__(self):
        return len(self.X), len(self.y)

    def __getitem__(self, idx):
        return self.X[idx], self.y[idx]


if __name__ == '__main__':
    dataset = NumbersDataset()
    dataloader = DataLoader(dataset, batch_size=50, shuffle=True, num_workers=2)
    # print(len(dataset))
    # plt.imshow(dataset[100])
    # plt.show()
    print(next(iter(dataloader)))

其中df['input_img'] 列包含图像的位置 ('/path/to/pic/480p/boxing-fisheye/00010.jpg'),df['mask_img'] 包含所有掩码图像的位置。我正在尝试加载图像,但出现错误:

TypeError: 'tuple' 对象不能被解释为整数

但是,如果我不使用 DataLoader 并执行以下操作:

     dataset = NumbersDataset()
     print(len(dataset))
     print(dataset[10:20])

然后我得到了我所期望的。谁能告诉我我做错了什么?

【问题讨论】:

    标签: python-3.x deep-learning pytorch data-generation


    【解决方案1】:

    您不能为 __len__ 方法返回 tuple。预期类型为int

    # perhaps you can add the list length's for the total length
    # but no matter how you choose to implement the method you can
    # only return on value of type integer `int`
    def __len__(self):
        return len(self.X) + len(self.y)
    

    【讨论】:

    • 如果我只返回self.X的长度呢?它会起作用吗?我猜它只需要长度,以便它可以迭代这些值。我知道Xy 的长度是一样的
    • 那应该没问题。这更多的是由您决定的实现细节。错误是当Dataloader 将其视为单个int 时,您尝试返回两个值,如果不是,则失败。
    • 你能告诉我为什么没有DataLoader 可以工作吗?有区别吗?
    • 因为 DataLoader 期望长度属性的类型为 int 的单个值。可能是因为它正在添加或使用来自__len__ 的值来做一些数学运算。如果该值不是整数,则数学失败。例如,运行 (1,2)+1 失败,因为您无法对 tuple 类型执行数学运算
    • 有道理。谢谢
    猜你喜欢
    • 2021-10-14
    • 2017-08-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多