【问题标题】:Validation dataset in PyTorch using DataLoaders使用 DataLoaders 在 PyTorch 中验证数据集
【发布时间】:2021-01-13 10:58:10
【问题描述】:

我想在 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 以获得更准确的结果,我只想在这里快速验证)。

【问题讨论】:

标签: neural-network pytorch


【解决方案1】:

在 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)

【讨论】:

  • 是的...就是这样!
  • val_loader 应该将 val_subset 作为数据集参数,而不是 train_subset,对吗?
【解决方案2】:

如果你想确保你的分组有平衡的班级,你可以使用train_test_split from 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 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)

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 2017-06-14
    • 2020-03-18
    • 2020-08-21
    • 2020-06-19
    • 2020-02-29
    • 2023-04-02
    • 2021-02-06
    • 2023-01-11
    相关资源
    最近更新 更多