使用数据加载器。
数据集
首先,您定义一个数据集。您可以使用软件包的数据集torchvision.datasets
或使用ImageFolder
随后Imagenet的结构数据集类。
trainset=torchvision.datasets.ImageFolder(root='/path/to/your/data/trn', transform=generic_transform)
testset=torchvision.datasets.ImageFolder(root='/path/to/your/data/val', transform=generic_transform)
变身
转换对于动态处理加载的数据非常有用。如果使用图像,则必须使用ToTensor()
转换将已加载的图像从PIL
转换为torch.tensor
。可以将更多转换打包为复合转换,如下所示。
generic_transform = transforms.Compose([
transforms.ToTensor(),
transforms.ToPILImage(),
#transforms.CenterCrop(size=128),
transforms.Lambda(lambda x: myimresize(x, (128, 128))),
transforms.ToTensor(),
transforms.Normalize((0., 0., 0.), (6, 6, 6))
])
资料载入器
然后,您定义一个数据加载器,该数据加载器在训练时准备下一批。您可以设置用于数据加载的线程数。
trainloader=torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True, num_workers=8)
testloader=torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False, num_workers=8)
为了进行培训,您只需要列举数据加载器即可。
for i, data in enumerate(trainloader, 0):
inputs, labels = data
inputs, labels = Variable(inputs.cuda()), Variable(labels.cuda())
# continue training...
NumPy的东西
是。您必须使用.numpy()
方法将torch.tensor
转换为numpy
才能对其进行处理。如果使用的是CUDA,则必须先使用.cpu()
方法将数据从GPU下载到CPU,然后再调用.numpy()
。就个人而言,来自MATLAB背景,我更喜欢使用火炬张量进行大部分工作,然后仅将数据转换为numpy以便可视化。还要记住,割炬在通道优先模式下存储数据,而numpy和PIL与通道最后模式一起工作。这意味着您需要使用np.rollaxis
将通道轴移动到最后一个。下面是示例代码。
np.rollaxis(make_grid(mynet.ftrextractor(inputs).data, nrow=8, padding=1).cpu().numpy(), 0, 3)
记录中
我发现可视化特征图的最佳方法是使用张量板。可以在yunjey / pytorch-tutorial中找到代码。
0
我试图做一个简单的事情,就是使用火炬用随机梯度下降(SGD)训练线性模型:
代码运行良好,尽管我的
get_batch2
方法看起来真的很简单/天真,可能是因为我对pytorch不熟悉,但是我找不到在他们讨论如何检索数据批次的好地方。我遍历了他们的教程( http://pytorch.org/tutorials/beginner/pytorch_with_examples.html )和数据集( http://pytorch.org/tutorials/beginner/data_loading_tutorial.html ),但是没有运气。所有教程似乎都假设一个人在开始时就已经具有批处理和批处理大小,然后继续训练该数据而不更改它(具体请参见http://pytorch.org/tutorials/beginner/pytorch_with_examples.html# pytorch变量和autograd )。所以我的问题是我是否真的需要将我的数据转回numpy,以便可以获取它的一些随机样本,然后使用Variable将其转回到pytorch以便能够在内存中进行训练?有没有办法用火炬获得迷你批次?
我看了割炬提供的一些功能,但是运气不好:
即使我提供的代码工作正常,我还是担心它不是一种有效的实现,而且如果我使用GPU,则会进一步放慢速度(因为我猜想它会将东西放到内存中,然后再将它们取回放置)他们这样的GPU很愚蠢)。
我根据建议使用
torch.index_select()
的答案实施了一个新方法:但是,这似乎有问题,因为如果
X,Y
不是变量X,Y
那么它将不起作用……这确实很奇怪。我将此添加到pytorch论坛: https ://discuss.pytorch.org/t/how-to-get-mini-batches-in-pytorch-in-a-clean-and-efficiency-way/10322现在,我正在努力为gpu进行这项工作。我最新的版本:
错误:
我不明白,我真的必须做:
得到整数?
如果数据可以是变量,也将是理想的。看来
torch.index_select
对于Variable
类型数据不起作用。此整数列表仍然不起作用: