当前位置: 首页 > 知识库问答 >
问题:

批量加载一个巨大的数据集来训练pytorch

长孙燕七
2023-03-14

我正在训练一个LSTM,以便将时间序列数据分类为2类(0和1)。我在驱动器上有巨大的数据集,其中0类和1类数据位于不同的文件夹中。我试图通过创建一个Dataset类并将DataLoader包装在它周围来批量使用LSTM。我必须做整形等预处理。这是我的密码

'

class LoadingDataset(Dataset):
  def __init__(self,data_root1,data_root2,file_name):
    self.data_root1=data_root1#Has the path for class1 data
    self.data_root2=data_root2#Has the path for class0 data
    self.fileap1= pd.DataFrame()#Stores class 1 data
    self.fileap0 = pd.DataFrame()#Stores class 0 data
    self.file_name=file_name#List of all the files at data_root1 and data_root2
    self.labs1=None #Will store the class 1 labels
    self.labs0=None #Will store the class 0 labels

  def __len__(self):
    return len(self.fileap1) 

  def __getitem__(self, index):        
    self.fileap1 = pd.read_csv(self.data_root1+self.file_name[index],header=None)#read the csv file for class 1
    self.fileap1=self.fileap1.iloc[1:,1:].values.reshape(-1,WINDOW+1,1)#reshape the file for lstm
    self.fileap0 = pd.read_csv(self.data_root2+self.file_name[index],header=None)#read the csv file for class 0
    self.fileap0=self.fileap0.iloc[1:,1:].values.reshape(-1,WINDOW+1,1)#reshape the file for lstm
    self.labs1=np.array([1]*len(self.fileap1)).reshape(-1,1)#create the labels 1 for the csv file
    self.labs0=np.array([0]*len(self.fileap0)).reshape(-1,1)#create the labels 0 for the csv file
    # print(self.fileap1.shape,' ',self.fileap0.shape)
    # print(self.labs1.shape,' ',self.labs0.shape)
    self.fileap1=np.append(self.fileap1,self.fileap0,axis=0)#combine the class 0 and class one data
    self.fileap1 = torch.from_numpy(self.fileap1).float()
    self.labs1=np.append(self.labs1,self.labs0,axis=0)#combine the label0 and label 1 data
    self.labs1 = torch.from_numpy(self.labs1).int()
    # print(self.fileap1.shape,' ',self.fileap0.shape)
    # print(self.labs1.shape,' ',self.labs0.shape)

    return self.fileap1,self.labs1

data_root1 = '/content/gdrive/My Drive/Data/Processed_Data/Folder1/One_'#location of class 1 data
data_root2 = '/content/gdrive/My Drive/Data/Processed_Data/Folder0/Zero_'#location of class 0 data
training_set=LoadingDataset(data_root1,data_root2,train_ind)#train_ind is a list of file names that have to be read from data_root1 and data_root2
training_generator = DataLoader(training_set,batch_size =2,num_workers=4)

for epoch in range(num_epochs):
  model.train()#Setting the model to train mode after eval mode to train for next epoch once the testing for that epoch is finished
  for i, (inputs, targets) in enumerate(train_loader):
    .
    .
    .
    .

`我在运行此代码时遇到此错误

RuntimeError:Traceback(最后一次调用):文件“/usr/local/lib/python3.6/dist-packages/torch/utils/data/\u-utils/worker.py”,第99行,in-worker-loop samples=collate\u fn([dataset[i]表示批处理索引中的i])文件“/usr/local/lib/python3.6/dist-packages/torch/utils/data/\u-utils/data/\u-collate.py”,第68行,在default\u-collate return[default\u-collate(samples)for samples in transposed]文件/usr/local/lib/python3.6/dist-packages/torch/utils/data/\u-utils/collate.py]第68行中,在return[default\u-collate(samples)for samples in transposed]文件/usr/local/lib/python3.6/dist-packages/torch/utils/data/\u-utils/collate.py]第43行中,在默认情况下,请核对返回火炬。堆栈(批处理,0,out=out)运行时错误:参数0无效:除维度0外,张量的大小必须匹配。在/pytorch/aten/src/TH/generic/THTensor处获得尺寸为1的96596和25060。cpp:711

我的问题是1。我是否正确地实现了这一点,这就是您对数据集进行批处理和培训的方式吗?

2.DataLoader的batch_大小与LSTM的batch_大小不同,因为DataLoader的batch_大小指的是文件的数量,而LSTM模型的batch_大小指的是实例的数量,所以这里会出现另一个错误吗?

3.我不知道如何缩放此数据集,因为MinMaxScaler必须应用于整个数据集。

感谢答复。如果我必须为每个问题创建单独的帖子,请告诉我。

非常感谢。

共有1个答案

姚文轩
2023-03-14

以下是pytorch的工作总结:

  • 您有一个数据集,它是一个具有\uuuu len\uuuu方法和\uuu getitem\uuuu方法的对象
  • 您可以从该数据集创建一个数据加载器,并创建一个collate\u fn
  • 迭代数据加载器,并将一批数据传递给模型

所以基本上你的训练循环会像

for x, y in dataloader:
    output = model(x)
...

或者

for x, y in dataloader:
        output = model(*x)
    ...

如果您的modelforward方法接受多个参数。

那么这是如何工作的呢?基本上,您有一个批处理索引的生成器batch_sampler,下面是您的dataloader中的循环。

for indices in batch_sampler:
    yield collate_fn([dataset[i] for i in indices])

因此,如果您希望一切正常工作,您必须查看模型的转发方法,并查看它需要多少参数(根据我的经验,LSTM的转发方法可以有多个参数),并确保您使用collate_fn正确地传递这些。

 类似资料:
  • 我有文件及其非常大的文件说100MB文件。我想执行NER以提取组织名称。我使用OpenNLP进行了培训。 示例代码: 但是我得到了一个错误:。 有没有办法使用openNLP for NER来训练大型数据集?你能发布示例代码吗? 当我谷歌时,我发现Class GIS和DataIndexer界面可用于训练大型数据集,但我知道如何训练?你能发布示例代码吗?

  • 问题内容: 因此,我一直遵循Google的官方tensorflow指南,并尝试使用Keras构建一个简单的神经网络。但是,在训练模型时,它不使用整个数据集(具有60000个条目),而是仅使用1875个条目进行训练。有可能解决吗? 输出: 这是我一直在为此工作的原始Google colab笔记本:https ://colab.research.google.com/drive/1NdtzXHEpiN

  • 本文向大家介绍TensorFlow实现随机训练和批量训练的方法,包括了TensorFlow实现随机训练和批量训练的方法的使用技巧和注意事项,需要的朋友参考一下 TensorFlow更新模型变量。它能一次操作一个数据点,也可以一次操作大量数据。一个训练例子上的操作可能导致比较“古怪”的学习过程,但使用大批量的训练会造成计算成本昂贵。到底选用哪种训练类型对机器学习算法的收敛非常关键。 为了Tensor

  • 问题内容: 我正在考虑对word2vec进行Web爬网转储上超过10 TB +大小的海量大规模数据的培训。 我对iMac上的c实现GoogleNews-2012转储(1.5gb)进行了亲自培训,花了大约3个小时来训练和生成矢量(对速度印象深刻)。我没有尝试python实现:(我在某处读到,在300个矢量长度的wiki dump(11gb)上生成矢量大约需要9天的时间来生成。 如何加快word2ve

  • 问题内容: 我想知道是否有可能保存经过部分训练的Keras模型并在再次加载模型后继续进行训练。 这样做的原因是,将来我将拥有更多的训练数据,并且我不想再次对整个模型进行训练。 我正在使用的功能是: 编辑1:添加了完全正常的示例 对于10个纪元后的第一个数据集,最后一个纪元的损失将为0.0748,精度为0.9863。 保存,删除和重新加载模型后,第二个数据集上训练的模型的损失和准确性分别为0.171

  • 我有多个数据集,每个数据集中有不同数量的图像(和不同的图像维度)。在训练循环中,我想从所有数据集中随机加载一批图像,但每个批次只包含单个数据集中的图像。例如,我有数据集A、B、C、D,每个数据集都有图像01。jpg,02。jpg,…n.jpg(其中n取决于数据集),假设批量大小为3。例如,在第一个加载的批次中,我可能会在下一个批次[D/01.jpg,D/05.jpg,D/12.jpg]中获得图像[