我想在 PyTorch 和 Torchvision 中加载 MNIST 数据集,将其分为训练、验证和测试部分。到目前为止我已经:
def load_dataset():
train_loader = torch.utils.data.DataLoader(
torchvision.datasets.MNIST(
'/data/', train=True, download=True,
transform=torchvision.transforms.Compose([
torchvision.transforms.ToTensor()])),
batch_size=batch_size_train, shuffle=True)
test_loader = torch.utils.data.DataLoader(
torchvision.datasets.MNIST(
'/data/', train=False, download=True,
transform=torchvision.transforms.Compose([
torchvision.transforms.ToTensor()])),
batch_size=batch_size_test, shuffle=True)
如果训练数据集位于
DataLoader
中,如何将其分为训练数据集和验证数据集?我想使用训练数据集中的最后 10000 个示例作为验证数据集(我知道我应该做一份 CV 以获得更准确的结果,我只想在这里快速验证)。
在 PyTorch 中将训练数据集拆分为训练和验证实际上比应有的要困难得多。
首先,将训练集分为训练和验证子集(类
Subset
),它们是不是数据集(类Dataset
):
train_subset, val_subset = torch.utils.data.random_split(
train, [50000, 10000], generator=torch.Generator().manual_seed(1))
然后从这些数据集中获取实际数据:
X_train = train_subset.dataset.data[train_subset.indices]
y_train = train_subset.dataset.targets[train_subset.indices]
X_val = val_subset.dataset.data[val_subset.indices]
y_val = val_subset.dataset.targets[val_subset.indices]
请注意,这样我们没有有
Dataset
对象,因此我们不能使用DataLoader
对象进行批量训练。如果您想使用 DataLoaders,它们可以直接与子集一起使用:
train_loader = DataLoader(dataset=train_subset, shuffle=True, batch_size=BATCH_SIZE)
val_loader = DataLoader(dataset=val_subset, shuffle=False, batch_size=BATCH_SIZE)
如果您想确保您的分组具有平衡的类别,您可以使用
train_test_split
中的 sklearn
。
import torchvision
from torch.utils.data import DataLoader, Subset
from sklearn.model_selection import train_test_split
VAL_SIZE = 0.1
BATCH_SIZE = 64
mnist_train = torchvision.datasets.MNIST(
'/data/',
train=True,
download=True,
transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor()])
)
mnist_test = torchvision.datasets.MNIST(
'/data/',
train=False,
download=True,
transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor()])
)
# generate indices: instead of the actual data we pass in integers instead
train_indices, val_indices, _, _ = train_test_split(
range(len(mnist_train)),
mnist_train.targets,
stratify=mnist_train.targets,
test_size=VAL_SIZE,
)
# generate a subset based on indices
train_split = Subset(mnist_train, train_indices)
val_split = Subset(mnist_train, val_indices)
# create batches
train_batches = DataLoader(train_split, batch_size=BATCH_SIZE, shuffle=True)
val_batches = DataLoader(val_split, batch_size=BATCH_SIZE, shuffle=True)
test_batches = DataLoader(mnist_test, batch_size=BATCH_SIZE, shuffle=True)