【问题标题】:pytorch DataLoader: `Tensors must have same number of dimensions`pytorch DataLoader:`张量必须具有相同的维数`
【发布时间】:2020-06-10 08:56:08
【问题描述】:

我正在尝试在 Pytorch 中拟合 LSTM 模型。我的数据太大而无法读入内存,因此我想使用 Pytorch 的 DataLoader 函数创建小批量数据。

我有两个特征作为输入(X1X2)。我有一个输出功能(y)。我使用X1X2 的365 个时间步长作为用于预测y 的特征。

我的训练数组的维度是:

(n_observations, n_timesteps, n_features) == (9498, 365, 2)

我不明白为什么下面的代码不起作用,因为我看到了其他示例,其中 X、y 对具有不同的维度数(LSTM for runoff modellingPytorch's own docs

最小可重现示例

import numpy as np
import torch
from torch.utils.data import DataLoader

train_x = torch.Tensor(np.random.random((9498, 365, 2)))
train_y = torch.Tensor(np.random.random((9498, 1)))
val_x = torch.Tensor(np.random.random((1097, 365, 2)))
val_y = torch.Tensor(np.random.random((1097, 1)))
test_x = torch.Tensor(np.random.random((639, 365, 2)))
test_y = torch.Tensor(np.random.random((639, 1)))

train_dataset = (train_x, train_y)
test_dataset = (test_x, test_y)
val_dataset = (val_x, val_y)

train_dataloader = DataLoader(train_dataset, batch_size=256)

iterator = train_dataloader.__iter__()
iterator.next()

输出:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-47-2a0b28b53c8f> in <module>
     13 
     14 iterator = train_dataloader.__iter__()
---> 15 iterator.next()

/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py in __next__(self)
    344     def __next__(self):
    345         index = self._next_index()  # may raise StopIteration
--> 346         data = self._dataset_fetcher.fetch(index)  # may raise StopIteration
    347         if self._pin_memory:
    348             data = _utils.pin_memory.pin_memory(data)

/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py in fetch(self, possibly_batched_index)
     45         else:
     46             data = self.dataset[possibly_batched_index]
---> 47         return self.collate_fn(data)

/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/collate.py in default_collate(batch)
     53             storage = elem.storage()._new_shared(numel)
     54             out = elem.new(storage)
---> 55         return torch.stack(batch, 0, out=out)
     56     elif elem_type.__module__ == 'numpy' and elem_type.__name__ != 'str_' \
     57             and elem_type.__name__ != 'string_':

RuntimeError: invalid argument 0: Tensors must have same number of dimensions: got 4 and 3 at /tmp/pip-req-build-4baxydiv/aten/src/TH/generic/THTensor.cpp:680

【问题讨论】:

    标签: python python-3.x numpy machine-learning pytorch


    【解决方案1】:

    torch.utils.data.DataLoader 必须得到一个torch.utils.data.Dataset 作为参数。你正在给一个张量元组。我建议你使用torch.utils.data.TensorDataset如下:

    from torch.utils.data import DataLoader, TensorDataset
    
    train_x = torch.rand(9498, 365, 2)     
    train_y = torch.rand(9498, 1)
    
    train_dataset = TensorDataset(train_x, train_y)
    train_dataloader = DataLoader(train_dataset, batch_size=256)
    
    for x, y in train_dataloader:
        print (x.shape)
    

    检查它是否能解决您的问题。

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 2021-02-11
      • 2019-11-06
      • 1970-01-01
      • 2019-11-11
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多