pyTorch: создание набора данных - PullRequest
0 голосов
/ 29 января 2019

Я получил большой кадр данных pandas с данными измерений, основанными на времени (значения датчиков, информация о времени не должна быть входом в сеть).Этот фрейм данных помещается в тензор, а затем загружается с torch.Dataloader.

Загрузчик данных очень медленный, загрузка графического процессора составляет ~ 3%.

Как видно из кода ниженабор данных помещается в тензор и затем помещается в torch.utils.data.DataLoader.Этот загрузчик затем используется с enumerate (Dataloader).

Во время моего исследования я обнаружил torch.utils.data.TensorDataset, но когда я пытаюсь поместить тензор в этот тип, я получаю ошибку: TypeError: Variableданные должны быть тензором, но получили список

Есть ли какие-либо предложения по этому поводу?

Также я нашел сэмплеры из torch.Но когда их использовать, когда я получаю данные из загрузчика данных, просто очень медленно.

    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 голосов
/ 29 января 2019

Вы видите ошибку, потому что TensorDataset возвращает кортеж тензоров в качестве выходных данных.Если вы 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 раз.а затем объединение результатов.В зависимости от того, насколько дорог ваш код графического процессора и размерности данных, вы можете или не сможете насытить свой графический процессор простым решением DataLoader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...