반응형
파이토치 RandomSampler 이용하여 데이터 무작위로 섞기¶
- 파이토치에서 제공한는
RandomSampler
함수는 주로 데이터를 무작위로 섞기위해 사용하며, 데이터를 섞기 앞서 무작위로 섞인 순서를 기억하기 위한 장치로 사용됩니다. RandomSampler
사용하여 순서를 인덱스 배열 형태로 기억하고, 인덱스 배열을 이용하여 데이터를 섞습니다.TensorDataset
,DataLoader
를 이용하여 파이토치 DataLoader를 만들어줍니다
step1: 예시 데이터 생성
In [1]:
import numpy as np
import torch
x = torch.tensor([[ 0.7333, 0, 0.1339],
[-0.8729, 1, 0.2862],
[ 0.3203, 2, 1.0126],
[ 0.6787, 3, 0.7913],
[-0.3768, 4, 0.6899],
[ 0.6003, 5, 0.0986],
[ 0.1556, 6, 0.0639],
[ 1.1163, 7, -0.1434],
[-0.7078, 8, 1.5020]])
y = torch.tensor([1, 0, 1, 0, 0, 0, 1, 1, 1])
step2: RandomSampler
객체 생성 및 인덱스 순서 리스트 생성
In [2]:
from torch.utils.data import RandomSampler
# RandomSampler 객체 생성
random_object = RandomSampler(x)
# 인덱스 순서 리스트 만들기
index_order_list = []
for index in random_object:
index_order_list.append(index)
index_order_list
Out[2]:
[1, 8, 5, 7, 6, 2, 4, 3, 0]
step3: 인덱스 순서를 이용하여 데이터 섞기
In [3]:
x = x[index_order_list]
y = y[index_order_list]
step4: 파이토치 Dataset
과 DataLoader
생성
In [4]:
# DataLoader 객체 생성
from torch.utils.data import TensorDataset, DataLoader
input_data = TensorDataset(x, y)
train_dataloader = DataLoader(input_data, shuffle=False)
In [5]:
for i in train_dataloader:
print(i)
[tensor([[-0.8729, 1.0000, 0.2862]]), tensor([0])] [tensor([[-0.7078, 8.0000, 1.5020]]), tensor([1])] [tensor([[0.6003, 5.0000, 0.0986]]), tensor([0])] [tensor([[ 1.1163, 7.0000, -0.1434]]), tensor([1])] [tensor([[0.1556, 6.0000, 0.0639]]), tensor([1])] [tensor([[0.3203, 2.0000, 1.0126]]), tensor([1])] [tensor([[-0.3768, 4.0000, 0.6899]]), tensor([0])] [tensor([[0.6787, 3.0000, 0.7913]]), tensor([0])] [tensor([[0.7333, 0.0000, 0.1339]]), tensor([1])]
[참고] randperm
를 이용해서 아래와 같이 똑같은 기능을 구현할 수 있습니다
In [6]:
import torch
import numpy as np
from torch.utils.data import TensorDataset, DataLoader
# 예시 데이터
x = torch.tensor([[ 0.7333, 0, 0.1339],
[-0.8729, 1, 0.2862],
[ 0.3203, 2, 1.0126],
[ 0.6787, 3, 0.7913],
[-0.3768, 4, 0.6899],
[ 0.6003, 5, 0.0986],
[ 0.1556, 6, 0.0639],
[ 1.1163, 7, -0.1434],
[-0.7078, 8, 1.5020]])
y = torch.tensor([1, 0, 1, 0, 0, 0, 1, 1, 1])
# randperm 메서드를 활용한 데이터 셔플
index_order_list = torch.randperm(x.size(0))
x = x[index_order_list]
y = y[index_order_list]
# DataLoader 객체 생성
input_data = TensorDataset(x, y)
train_dataloader = DataLoader(input_data, shuffle=False)
for i in train_dataloader:
print(i)
[tensor([[0.6787, 3.0000, 0.7913]]), tensor([0])] [tensor([[0.1556, 6.0000, 0.0639]]), tensor([1])] [tensor([[0.3203, 2.0000, 1.0126]]), tensor([1])] [tensor([[-0.7078, 8.0000, 1.5020]]), tensor([1])] [tensor([[0.7333, 0.0000, 0.1339]]), tensor([1])] [tensor([[-0.8729, 1.0000, 0.2862]]), tensor([0])] [tensor([[-0.3768, 4.0000, 0.6899]]), tensor([0])] [tensor([[ 1.1163, 7.0000, -0.1434]]), tensor([1])] [tensor([[0.6003, 5.0000, 0.0986]]), tensor([0])]
반응형
'python' 카테고리의 다른 글
파이토치 데이터로더 데이터 확인하기 dataloader, next(iter(dataloader)) (0) | 2023.08.18 |
---|---|
파이썬 이미지 객체 경계선(boundary) 표시 skimage, mark_boundaries 활용 (0) | 2023.08.18 |
파이썬 이미지 자르기 (0) | 2023.08.18 |
파이썬 정규분포 생성 및 pdf 산출 (0) | 2023.08.15 |
파이썬 nan 값 시각화 missingno.matrix (0) | 2023.08.15 |
댓글