pyTorch:创建数据集

时间:2019-01-29 08:36:37

标签: pytorch

我得到了一个大熊猫数据框,其中包含基于时间的测量数据(传感器值,时间信息不需要作为网络的输入)。 将该数据帧放入张量中,然后使用torch.Dataloader加载。

数据加载器非常慢,GPU利用率约为3%。

正如您在下面的代码中看到的那样,将数据集放入张量,然后放入torch.utils.data.DataLoader。然后将此加载器与enumerate(Dataloader)一起使用。

在研究过程中,我找到了torch.utils.data.TensorDataset,但是当我尝试将张量放入这种类型时,出现错误: TypeError:变量数据必须是张量,但有列表

对此有何建议?

我也从火炬中找到了采样器。但是什么时候使用这些,当我从数据加载器中获取数据时,速度非常慢。

    dataset = big_dataframe_flt.values
    (looks like: array([[ 0.17114914, -0.67040386, -0.72875149, ..., -0.51023438,
     0.49735906, -0.74075046],
   [ 0.17114914, -0.67088608, -0.72631001, ..., -0.53046875,
     0.49741296, -0.74127526],)

    dataset = torch.tensor(dataset).float()
    dataset = torch.utils.data.TensorDataset(dataset)

    data_loader = torch.utils.data.DataLoader(dataset=dataset, batch_size=100, shuffle=True, num_workers=4, pin_memory=True)

    for epoch in range(num_epochs):
        model.train()
        for batch_idx, data in enumerate(data_loader):
            data = Variable(data).to(device)
            recon_batch, mu, var = model(data)

            # Backprop and optimize
            loss = loss_function(recon_batch, data, mu, var)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()


data = Variable(data).to(device)
TypeError: Variable data has to be a tensor, but got list

1 个答案:

答案 0 :(得分:0)

您看到的错误是因为TensorDataset返回张量的 tuple 作为输出。如果您print(dataset[0]),则会看到(tensor([ 0.1711, -0.6704, -0.7288, -0.5102, 0.4974, -0.7408]),)而不是tensor([ 0.1711, -0.6704, -0.7288, -0.5102, 0.4974, -0.7408])。因此,您必须编写data = Variable(data[0]).to(device)或在循环for batch_idx, (data, ) in enumerate(data_loader):中破坏元组。这应该使您可以使用DataLoader

话虽这么说,如果您的数据是低维的,则DataLoader代码不是很有效,因为您必须执行大量采样操作,并且每次操作都要付出Python解释器的开销-换句话说,此代码不会从矢量化中受益很多。您可以通过增加工作人员的数量来部分解决此问题,但是最后,性能最高的版本可能是编写自己的采样器,该采样器使用长度为100的整数数组对数据张量进行索引,而不是对其进行100次整数采样然后将结果串联起来。根据GPU代码的昂贵程度和数据的维度,您是否可以使用简单的DataLoader解决方案使GPU饱和。

相关问题