如何在您自己的数据上使用torch.utils.data.Dataset和torch.utils.data.DataLoader(而不仅仅是torchvision.datasets)?有没有办法使用内置的DataLoaders,他们在TorchVisionDatasets上使用的DataLoaders可以在任何数据集上使用?
torch.utils.data.Dataset
torch.utils.data.DataLoader
torchvision.datasets
DataLoaders
TorchVisionDatasets
z9smfwbn1#
是的,这是可能的。只要自己创建对象,例如。
import torch.utils.data as data_utils train = data_utils.TensorDataset(features, targets) train_loader = data_utils.DataLoader(train, batch_size=50, shuffle=True)
其中features和targets是Tensor。features必须是2-D,即每行代表一个训练样本的矩阵,targets可以是1-D或2-D,具体取决于您尝试预测的是标量还是向量。
features
targets
编辑:对@sarthak问题的回复
基本上是的,如果你创建一个TensorData类型的对象,那么构造器会调查特征Tensor(实际上叫做data_tensor)和目标Tensor(叫做target_tensor)的第一维是否具有相同的长度:
TensorData
data_tensor
target_tensor
assert data_tensor.size(0) == target_tensor.size(0)
然而,如果你想随后将这些数据送入神经网络,那么你需要小心。当卷积层处理像你这样的数据时,(我认为)所有其他类型的图层都希望数据以矩阵形式给出。因此,如果您遇到此类问题,一个简单的解决方案是转换您的4D数据集(给定为某种Tensor,例如FloatTensor)转换为矩阵。对于5000 xnxnx 3数据集,如下所示:
FloatTensor
2d_dataset = 4d_dataset.view(5000, -1)
(The值-1告诉PyTorch自动计算第二维的长度。)
-1
zqry0prt2#
通过扩展data.Dataset类可以很容易地做到这一点。根据API,您所要做的就是实现两个函数:__getitem__和__len__。然后,您可以使用DataLoader Package 数据集,如API和@pho7的答案所示。我认为ImageFolder类是一个引用。参见代码here。
data.Dataset
__getitem__
__len__
ImageFolder
qyzbxkaa3#
是的,你可以做到。希望这对未来的读者有所帮助。
from torch.utils.data import TensorDataset, DataLoader import torch.utils.data as data_utils inputs = [[ 1, 2, 3, 4, 5],[ 2, 3, 4, 5, 6]] targets = [ 6,7] batch_size = 2 inputs = torch.tensor(inputs) targets = torch.IntTensor(targets) dataset =TensorDataset(inputs, targets) data_loader = DataLoader(dataset, batch_size, shuffle = True)
pnwntuvh4#
除了user3693922's answer和accepted answer(分别为link,“快速”PyTorch文档示例,用于为自定义数据集创建自定义数据加载器,以及在“最简单”的情况下创建自定义数据加载器)之外,还有一个更详细的PyTorch官方专用教程,介绍如何使用相关预处理创建自定义数据加载器:"writing custom datasets, dataloaders and transforms" official PyTorch tutorial
fd3cxomn5#
是的,Pytorch的DataLoader被设计为接受Dataset对象作为输入,但是它所需要的只是一个具有__getitem__和__len__属性的对象,所以任何泛型容器都足够了。例如,一个以features(x值)作为第一个元素,以targets(y值)作为第二个元素的元组列表可以直接传递给DataLoader,如下所示:
DataLoader
Dataset
x = [6,3,8,2,5,9,7] y = [1,0,1,0,0,1,1] data = [*zip(x,y)] dataloader = torch.utils.data.DataLoader(data) for features, targets in dataloader: #...
5条答案
按热度按时间z9smfwbn1#
是的,这是可能的。只要自己创建对象,例如。
其中
features
和targets
是Tensor。features
必须是2-D,即每行代表一个训练样本的矩阵,targets
可以是1-D或2-D,具体取决于您尝试预测的是标量还是向量。编辑:对@sarthak问题的回复
基本上是的,如果你创建一个
TensorData
类型的对象,那么构造器会调查特征Tensor(实际上叫做data_tensor
)和目标Tensor(叫做target_tensor
)的第一维是否具有相同的长度:然而,如果你想随后将这些数据送入神经网络,那么你需要小心。当卷积层处理像你这样的数据时,(我认为)所有其他类型的图层都希望数据以矩阵形式给出。因此,如果您遇到此类问题,一个简单的解决方案是转换您的4D数据集(给定为某种Tensor,例如
FloatTensor
)转换为矩阵。对于5000 xnxnx 3数据集,如下所示:(The值
-1
告诉PyTorch自动计算第二维的长度。)zqry0prt2#
通过扩展
data.Dataset
类可以很容易地做到这一点。根据API,您所要做的就是实现两个函数:__getitem__
和__len__
。然后,您可以使用DataLoader Package 数据集,如API和@pho7的答案所示。
我认为
ImageFolder
类是一个引用。参见代码here。qyzbxkaa3#
是的,你可以做到。希望这对未来的读者有所帮助。
pnwntuvh4#
除了user3693922's answer和accepted answer(分别为link,“快速”PyTorch文档示例,用于为自定义数据集创建自定义数据加载器,以及在“最简单”的情况下创建自定义数据加载器)之外,还有一个更详细的PyTorch官方专用教程,介绍如何使用相关预处理创建自定义数据加载器:"writing custom datasets, dataloaders and transforms" official PyTorch tutorial
fd3cxomn5#
是的,Pytorch的
DataLoader
被设计为接受Dataset
对象作为输入,但是它所需要的只是一个具有__getitem__
和__len__
属性的对象,所以任何泛型容器都足够了。例如,一个以features(x值)作为第一个元素,以targets(y值)作为第二个元素的元组列表可以直接传递给
DataLoader
,如下所示: