Класс RandomSampler
Класс RandomSampler в PyTorch предназначен для создания итератора, который возвращает индексы элементов набора данных в случайном порядке. Это основной механизм для организации перемешивания данных при обучении нейронных сетей. При создании объекта можно задать генератор случайных чисел, а также указать, должна ли выборка быть с замещением.
Основные параметры конструктора:
-
data_source- набор данных (dataset), из которого производится выборка -
replacement- флаг, указывающий на выборку с замещением (по умолчаниюFalse) -
num_samples- количество образцов для выборки (обязателен приreplacement=True) -
generator- генератор случайных чисел для воспроизводимости результатов
Синтаксис
torch.utils.data.RandomSampler(data_source, replacement=False, num_samples=None, generator=None)
Пример
Давайте создадим простой набор данных и применим к нему случайную выборку:
import torch
from torch.utils.data import TensorDataset, RandomSampler
from torch.utils.data import DataLoader
# Создаем набор данных из тензора
data = torch.tensor([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
dataset = TensorDataset(data)
# Создаем семплер для случайной выборки
sampler = RandomSampler(dataset)
# Создаем загрузчик данных с этим семплером
dataloader = DataLoader(dataset, batch_size=2, sampler=sampler)
# Выводим индексы и данные в случайном порядке
for batch in dataloader:
print(batch)
Результат выполнения кода:
tensor([[9, 10],
[3, 4]])
tensor([[5, 6],
[1, 2]])
tensor([[7, 8]])
Пример
Для воспроизводимости результатов зафиксируем генератор случайных чисел:
import torch
from torch.utils.data import TensorDataset, RandomSampler
from torch.utils.data import DataLoader
torch.manual_seed(42)
data = torch.tensor([10, 20, 30, 40, 50, 60, 70, 80])
dataset = TensorDataset(data)
# Создаем генератор для воспроизводимости
g = torch.Generator()
g.manual_seed(42)
sampler = RandomSampler(dataset, generator=g)
dataloader = DataLoader(dataset, batch_size=3, sampler=sampler)
# Теперь порядок будет всегда одинаковым при одинаковом зерне
for batch in dataloader:
print(batch)
Результат выполнения кода:
tensor([40, 10, 70])
tensor([50, 20, 60])
tensor([30, 80])
Пример
Создадим семплер с замещением для получения выборки большего размера:
import torch
from torch.utils.data import TensorDataset, RandomSampler
from torch.utils.data import DataLoader
torch.manual_seed(0)
data = torch.tensor(['a', 'b', 'c', 'd', 'e'])
dataset = TensorDataset(data)
# Создаем семплер с замещением на 10 элементов
sampler = RandomSampler(dataset, replacement=True, num_samples=10)
dataloader = DataLoader(dataset, batch_size=2, sampler=sampler)
for batch in dataloader:
print(batch)
Результат выполнения кода:
tensor(['c', 'b'])
tensor(['a', 'd'])
tensor(['e', 'e'])
tensor(['b', 'c'])
tensor(['d', 'a'])
Смотрите также
-
класс
SequentialSampler,
который возвращает индексы в последовательном порядке -
класс
SubsetRandomSampler,
который создает случайную выборку из подмножества данных -
класс
BatchSampler,
который группирует индексы в батчи заданного размера -
класс
Sampler,
который является базовым классом для всех семплеров