Pytorch 上具有相同标签的批次点
Batches of points with the same label on Pytorch
我想在每个包含 N 个训练点的批次上使用梯度下降来训练神经网络。我希望这些批次只包含具有相同标签的点,而不是从训练集中随机抽样。
例如,如果我正在使用 MNIST 进行训练,我希望批次如下所示:
batch_1 = {0,0,0,0,0,0,0,0}
batch_2 = {3,3,3,3,3,3,3,3}
batch_3 = {7,7,7,7,7,7,7,7}
.....
等等。
我如何使用 pytorch 完成它?
一种方法是为每个 class 创建子集和数据加载器,然后在每次迭代时通过在数据加载器之间随机切换来进行迭代:
import torch
from torch.utils.data import DataLoader, Subset
from torchvision.datasets import MNIST
from torchvision import transforms
import numpy as np
dataset = MNIST('path/to/mnist_root/',
transform=transforms.ToTensor(),
download=True)
class_inds = [torch.where(dataset.targets == class_idx)[0]
for class_idx in dataset.class_to_idx.values()]
dataloaders = [
DataLoader(
dataset=Subset(dataset, inds),
batch_size=8,
shuffle=True,
drop_last=False)
for inds in class_inds]
epochs = 1
for epoch in range(epochs):
iterators = list(map(iter, dataloaders))
while iterators:
iterator = np.random.choice(iterators)
try:
images, labels = next(iterator)
print(labels)
# do_more_stuff()
except StopIteration:
iterators.remove(iterator)
这适用于任何数据集(不仅仅是 MNIST)。
这是每次迭代打印标签的结果:
tensor([6, 6, 6, 6, 6, 6, 6, 6])
tensor([3, 3, 3, 3, 3, 3, 3, 3])
tensor([0, 0, 0, 0, 0, 0, 0, 0])
tensor([5, 5, 5, 5, 5, 5, 5, 5])
tensor([8, 8, 8, 8, 8, 8, 8, 8])
tensor([0, 0, 0, 0, 0, 0, 0, 0])
...
tensor([1, 1, 1, 1, 1, 1, 1, 1])
tensor([1, 1, 1, 1, 1, 1])
请注意,通过设置 drop_last=False
,将会有批次,有时会有少于 batch_size
个元素。通过将其设置为 True,所有批次的大小都将相同,但会删除一些数据点。
我想在每个包含 N 个训练点的批次上使用梯度下降来训练神经网络。我希望这些批次只包含具有相同标签的点,而不是从训练集中随机抽样。
例如,如果我正在使用 MNIST 进行训练,我希望批次如下所示:
batch_1 = {0,0,0,0,0,0,0,0}
batch_2 = {3,3,3,3,3,3,3,3}
batch_3 = {7,7,7,7,7,7,7,7}
.....
等等。
我如何使用 pytorch 完成它?
一种方法是为每个 class 创建子集和数据加载器,然后在每次迭代时通过在数据加载器之间随机切换来进行迭代:
import torch
from torch.utils.data import DataLoader, Subset
from torchvision.datasets import MNIST
from torchvision import transforms
import numpy as np
dataset = MNIST('path/to/mnist_root/',
transform=transforms.ToTensor(),
download=True)
class_inds = [torch.where(dataset.targets == class_idx)[0]
for class_idx in dataset.class_to_idx.values()]
dataloaders = [
DataLoader(
dataset=Subset(dataset, inds),
batch_size=8,
shuffle=True,
drop_last=False)
for inds in class_inds]
epochs = 1
for epoch in range(epochs):
iterators = list(map(iter, dataloaders))
while iterators:
iterator = np.random.choice(iterators)
try:
images, labels = next(iterator)
print(labels)
# do_more_stuff()
except StopIteration:
iterators.remove(iterator)
这适用于任何数据集(不仅仅是 MNIST)。 这是每次迭代打印标签的结果:
tensor([6, 6, 6, 6, 6, 6, 6, 6])
tensor([3, 3, 3, 3, 3, 3, 3, 3])
tensor([0, 0, 0, 0, 0, 0, 0, 0])
tensor([5, 5, 5, 5, 5, 5, 5, 5])
tensor([8, 8, 8, 8, 8, 8, 8, 8])
tensor([0, 0, 0, 0, 0, 0, 0, 0])
...
tensor([1, 1, 1, 1, 1, 1, 1, 1])
tensor([1, 1, 1, 1, 1, 1])
请注意,通过设置 drop_last=False
,将会有批次,有时会有少于 batch_size
个元素。通过将其设置为 True,所有批次的大小都将相同,但会删除一些数据点。