Как разделить набор обучающих данных на наборы обучающих, проверочных и тестовых данных? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть пользовательский набор данных изображений и его цель.Я создал тренировочный набор данных в PyTorch.Я хочу разделить его на 3 части: обучение, проверка и тестирование.Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

При заданном параметре train_frac=0.8 эта функция разделит dataset на 80%, 10%, 10%:

import torch, itertools
from torch.utils.data import TensorDataset

def dataset_split(dataset, train_frac):
    '''
    param dataset:    Dataset object to be split
    param train_frac: Ratio of train set to whole dataset

    Randomly split dataset into a dictionary with keys, based on these ratios:
        'train': train_frac
        'valid': (1-split_frac) / 2
        'test': (1-split_frac) / 2
    '''
    assert split_frac >= 0 and split_frac <= 1, "Invalid training set fraction"

    length = len(dataset)

    # Use int to get the floor to favour allocation to the smaller valid and test sets    
    train_length = int(length * train_frac)
    valid_length = int((length - train_length) / 2)
    test_length  = length - train_length - valid_length

    dataset = random_split(dataset, (train_length, valid_length, test_length))
    dataset = {name: set for name, set in zip(('train', 'valid', 'test'), sets)}
    return dataset
0 голосов
/ 29 ноября 2018

Если у вас есть «основной» набор данных, вы можете использовать data.Subset для его разделения.
Вот пример случайного разделения

import torch
from torch.utils import data
import random

master = data.Dataset( ... )  # your "master" dataset
n = len(master)  # how many total elements you have
n_test = int( n * .05 )  # number of test/val elements
n_train = n - 2 * n_test
idx = list(range(n))  # indices to all elements
random.shuffle(idx)  # in-place shuffle the indices to facilitate random splitting
train_idx = idx[:n_train]
val_idx = idx[n_train:(n_train + n_test)]
test_idx = idx[(n_train + n_test):]

train_set = data.Subset(master, train_idx)
val_set = data.Subset(master, val_idx)
test_set = data.Subset(master, test_idx)

Этого также можно достичьиспользуя data.random_split:

train_set, val_set, test_set = data.random_split(master, (n_train, n_val, n_test))
...