【问题标题】:torch dataloader for large csv file - incremental loading用于大型 csv 文件的火炬数据加载器 - 增量加载
【发布时间】:2022-01-01 19:52:11
【问题描述】:

我正在尝试编写一个自定义的 Torch 数据加载器,以便可以增量加载大型 CSV 文件(按块)。

我对如何做到这一点有一个粗略的想法。但是,我不断收到一些我不知道如何解决的 PyTorch 错误。


import numpy as np
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader

# Create dummy csv data
nb_samples = 110
a = np.arange(nb_samples)
df = pd.DataFrame(a, columns=['data'])
df.to_csv('data.csv', index=False)


# Create Dataset
class CSVDataset(Dataset):
    def __init__(self, path, chunksize, nb_samples):
        self.path = path
        self.chunksize = chunksize
        self.len = nb_samples / self.chunksize

    def __getitem__(self, index):
        x = next(
            pd.read_csv(
                self.path,
                skiprows=index * self.chunksize + 1,  #+1, since we skip the header
                chunksize=self.chunksize,
                names=['data']))
        x = torch.from_numpy(x.data.values)
        return x

    def __len__(self):
        return self.len


dataset = CSVDataset('data.csv', chunksize=10, nb_samples=nb_samples)
loader = DataLoader(dataset, batch_size=10, num_workers=1, shuffle=False)

for batch_idx, data in enumerate(loader):
    print('batch: {}\tdata: {}'.format(batch_idx, data))

我收到'float' object cannot be interpreted as an integer 错误

【问题讨论】:

    标签: pytorch dataloader


    【解决方案1】:

    错误是由这一行引起的:

    self.len = nb_samples / self.chunksize
    

    使用/ 进行除法时,结果始终为浮点数。但是你只能在__len__() 函数中返回一个整数。因此,您必须舍入 self.len 和/或将其转换为整数。例如,只需这样做:

    self.len = nb_samples // self.chunksize
    

    双斜杠 (//) 向下舍入并转换为整数。

    编辑: 您实际上可以在__len__() 中返回一个浮点数,但是在调用len(dataset) 时会发生错误。所以我猜len(dataset)DataLoader 类中的某个地方被调用。

    【讨论】:

    • 非常感谢您的建议。但是,通过此修复,我得到一个新错误:DataLoader worker (pid(s) 18357) exited unexpectedly
    • 此错误无关。但也许this 回答会有所帮助
    猜你喜欢
    • 2021-06-18
    • 2021-07-04
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2023-01-04
    相关资源
    最近更新 更多