Deep learning 如果事先不知道训练样本的顺序和总数,如何创建自定义PyTorch数据集?

Deep learning 如果事先不知道训练样本的顺序和总数,如何创建自定义PyTorch数据集?,deep-learning,pytorch,Deep Learning,Pytorch,我有一个42 GB的jsonl文件。该文件的每个元素都是一个json对象。我从每个json对象创建训练样本。但是我提取的每个json对象的训练样本数量可以在0到5个样本之间变化。在不读取内存中的整个jsonl文件的情况下创建自定义PyTorch数据集的最佳方法是什么 这就是我所说的数据集-。您有两个选择 如果有很多小文件不是问题,那么最简单的选择是将每个json对象预处理为单个文件。然后,您可以根据请求的索引读取每个索引。例如 class SingleFileDataset(数据集): def_

我有一个42 GB的jsonl文件。该文件的每个元素都是一个json对象。我从每个json对象创建训练样本。但是我提取的每个json对象的训练样本数量可以在0到5个样本之间变化。在不读取内存中的整个jsonl文件的情况下创建自定义PyTorch数据集的最佳方法是什么


这就是我所说的数据集-。

您有两个选择

  • 如果有很多小文件不是问题,那么最简单的选择是将每个json对象预处理为单个文件。然后,您可以根据请求的索引读取每个索引。例如
  • class SingleFileDataset(数据集):
    def_uuuinit_uuu(self,文件路径列表):
    self.list_of_file_path=list_of_file_path
    定义uu获取项目uu(自身,索引):
    返回np.load(self.list_of_file_path[index])或单个文件的等效读取代码
    
  • 您还可以将数据拆分为固定数量的文件,然后根据给定的索引计算样本所在的文件。然后,您需要将该文件打开到内存中并读取相应的索引。这在磁盘访问和内存使用之间进行了权衡。假设您有
    n个
    样本,我们在预处理期间将样本平均分割为
    c
    文件。现在,要阅读索引
    i
    处的示例,我们需要
  • 类拆分为文件数据集(数据集):
    def_uuinit_uu(self,文件路径列表,n个拆分):
    self.list_of_file_path=list_of_file_path
    self.n_splits=n_splits
    定义uu获取项目uu(自身,索引):
    #索引//n\u splits是相关文件,并且
    #索引%len(self)是该文件中的索引
    file\u to\u load=self.list\u文件路径[索引//self.n\u拆分]
    #加载文件
    file=np.load(文件)
    数据点=文件[索引%len(self)]
    
  • 最后,您可以使用允许访问磁盘上的行的文件。如果您有大量数据,这可能是最好的解决方案,因为数据将在磁盘上关闭。我在下面粘贴了一个实现:

    导入h5py
    进口火炬
    将torch.utils.data作为数据导入
    H5类数据集(data.Dataset):
    定义初始化(自,文件路径):
    超级(H5Dataset,self)。\uuuu init\uuuuu()
    h5_文件=h5py.file(文件路径)
    self.data=h5_file.get('data'))
    self.target=h5_file.get('label'))
    定义uu获取项目uu(自身,索引):
    return(torch.from_numpy(self.data[index,:,:,:,:]).float(),
    torch.from_numpy(self.target[index,:,:,:]).float()
    定义(自我):
    返回self.data.shape[0]
    

  • 我可以将每个json对象预处理为示例。但问题是一些json对象不返回任何样本,而有些对象最多返回5个样本。在这种情况下如何编写getitem方法?5个示例中的示例应该是不同的还是以某种方式分组的?如果它们是不同的,只需在预处理期间拆分它们即可。如果它们应该作为一个样本使用,那么只要返回对象中的任何内容就没有问题了?这会起作用的。我可以在批处理中获取json对象,并在调用模型之前拆分它们。虽然我在寻找一种更直接的方法。谢谢