Python 如何将numpy数组列表加载到pytorch数据集加载程序?
我有一个巨大的numpy数组列表,其中每个数组代表一个图像,我想使用torch.utils.data.Dataloader对象加载它。但是torch.utils.data.Dataloader的文档提到它直接从文件夹加载数据。我如何为我的事业修改它?我是pytorch的新手,任何帮助都将不胜感激。 我的单个图像的numpy数组看起来像这样。图像为RBG图像Python 如何将numpy数组列表加载到pytorch数据集加载程序?,python,numpy,pytorch,Python,Numpy,Pytorch,我有一个巨大的numpy数组列表,其中每个数组代表一个图像,我想使用torch.utils.data.Dataloader对象加载它。但是torch.utils.data.Dataloader的文档提到它直接从文件夹加载数据。我如何为我的事业修改它?我是pytorch的新手,任何帮助都将不胜感激。 我的单个图像的numpy数组看起来像这样。图像为RBG图像 [[[ 70 82 94] [ 67 81 93] [ 66 82 94] ..., [182 182 188
[[[ 70 82 94]
[ 67 81 93]
[ 66 82 94]
...,
[182 182 188]
[183 183 189]
[188 186 192]]
[[ 66 80 92]
[ 62 78 91]
[ 64 79 95]
...,
[176 176 182]
[178 178 184]
[180 180 186]]
[[ 62 82 93]
[ 62 81 96]
[ 65 80 99]
...,
[169 172 177]
[173 173 179]
[172 172 178]]
...,
我认为DataLoader实际需要的是一个将
Dataset
子类化的输入。您可以编写自己的dataset类,该类包含子类dataset
,也可以使用TensorDataset
,如下所示:
import torch
import numpy as np
from torch.utils.data import TensorDataset, DataLoader
my_x = [np.array([[1.0,2],[3,4]]),np.array([[5.,6],[7,8]])] # a list of numpy arrays
my_y = [np.array([4.]), np.array([2.])] # another list of numpy arrays (targets)
tensor_x = torch.Tensor(my_x) # transform to torch tensor
tensor_y = torch.Tensor(my_y)
my_dataset = TensorDataset(tensor_x,tensor_y) # create your datset
my_dataloader = DataLoader(my_dataset) # create your dataloader
对我有用。希望它能帮助您。PyTorch
DataLoader
需要一个DataSet
,您可以在。正确的方法是使用:
torch.utils.data.TensorDataset(*tensors)
这是一个用于包装张量的数据集,每个样本都将通过沿第一维度索引张量来检索。
参数*张量
表示与第一维度大小相同的张量
另一个类torch.utils.data.Dataset
是一个抽象类
下面是如何将numpy数组转换为张量:
import torch
import numpy as np
n = np.arange(10)
print(n) #[0 1 2 3 4 5 6 7 8 9]
t1 = torch.Tensor(n) # as torch.float32
print(t1) #tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
t2 = torch.from_numpy(n) # as torch.int32
print(t2) #tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=torch.int32)
被接受的答案使用了torch.Tensor
结构。
如果图像的像素范围为0-255,则可以使用:
timg = torch.from_numpy(img).float()
或torchvision方法,将PIL图像或numpy.ndarray转换为张量
但是这里有一个小技巧,你可以直接放置你的numpy数组
x1 = np.array([1,2,3])
d1 = DataLoader( x1, batch_size=3)
这同样有效,但如果打印d1.dataset
类型:
print(type(d1.dataset)) # <class 'numpy.ndarray'>
print(类型(d1.dataset))#
虽然我们实际上需要使用张量来处理CUDA,但最好使用张量为
数据加载器
提供数据,因为您有图像,您可能希望对它们执行转换。因此TensorDataset
不是这里的最佳选择。相反,您可以创建自己的数据集
。大概是这样的:
import torch
from torchvision import transforms
from torch.utils.data import Dataset, DataLoader
import numpy as np
from PIL import Image
class MyDataset(Dataset):
def __init__(self, data, targets, transform=None):
self.data = data
self.targets = torch.LongTensor(targets)
self.transform = transform
def __getitem__(self, index):
x = self.data[index]
y = self.targets[index]
if self.transform:
x = Image.fromarray(self.data[index].astype(np.uint8).transpose(1,2,0))
x = self.transform(x)
return x, y
def __len__(self):
return len(self.data)
# Let's create 10 RGB images of size 128x128 and 10 labels {0, 1}
data = list(np.random.randint(0, 255, size=(10, 3, 128, 128)))
targets = list(np.random.randint(2, size=(10)))
transform = transforms.Compose([transforms.Resize(64), transforms.ToTensor()])
dataset = MyDataset(data, targets, transform=transform)
dataloader = DataLoader(dataset, batch_size=5)
如果存在内存限制,是否有方法复制此功能?在torch.stack步骤中,我发现自己的内存不足。@Indrajit,当然,不用使用TensorDataset,只需定义自己的Dataset类,从文件中加载numpy数组即可。您不需要使用
toch.stack
来理解列表。相反,您可以直接使用torch.Tensor(my_x)
和torch.Tensor(my_y)
。嗨,对于DataLoader
的输入,np.array
与Tensor
有什么区别?我发现,如果输入x1
ifnp.array
,DataLoader
仍将输出tensor
,因此我认为使用np.array
数据馈送DataLoader
与使用tensor
数据是一样的,效果是一样的。唯一的区别是我们有一个转换,以防我们馈送numpy数组。transforms
从哪里来,在transform=transforms.Compose(…)
?@AdamMurphy它来自torchvision
包,我通过在导入它的代码中添加一行修正了答案。