커스텀 데이터 + 커스텀 전처리
텐서 생성 부분에서 이미지 전처리를 진행
import torch
import torchvision.transforms as tr
from torch.utils.data import DataLoader, Dataset
import numpy as np
train_images = np.random.randint(256,size=(100,32,32,3))
train_labels = np.random.randint(2,size=(100,1))
class MyDataset(Dataset):
def __init__(self, x_data, y_data, transform=None):
self.x_data = x_data
self.y_data = y_data
self.transform = transform
self.len = len(y_data)
def __getitem__(self, index):
sample = self.x_data[index], self.y_data[index]
if self.transform:
sample = self.transform(sample)
return sample
def __len__(self):
return self.len
직접 전처리 만들기
위 기본 양식과 같이 사용하기 위해 call 함수를 사용
def __call__ 내의 원하는 전처리 작업을 프로그래밍 할 수 있음
class ToTensor:
def __call__(self, sample):
inputs, labels = sample
inputs = torch.FloatTensor(inputs)
inputs = inputs.permute(2,0,1)
return inputs, torch.LongTensor(labels)
class LinearTensor:
def __init__(self, slope=1, bias=0):
self.slope = slope
self.bias = bias
def __call__(self, sample):
inputs, labels = sample
inputs = self.slope*inputs + self.bias
return inputs, labels
trans = tr.Compose([ToTensor(),LinearTensor(2,5)])
dataset1 = MyDataset(train_images,train_labels, transform=trans)
train_loader1 = DataLoader(dataset1, batch_size=10, shuffle=True)
dataiter1 = iter(train_loader1)
images1, labels1 = dataiter1.next()
print(images1.size())
torch.Size([10, 3, 32, 32])
class MyTransform:
def __call__(self, sample):
inputs, labels = sample
inputs = torch.FloatTensor(inputs)
inputs = inputs.permute(2,0,1)
labels = torch.FloatTensor(labels)
transf = tr.Compose([tr.ToPILImage(), tr.Resize(128),tr.ToTensor(),tr.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
final_output = transf(inputs)
return final_output, labels
dataset2 = MyDataset(train_images,train_labels, transform=MyTransform())
train_loader2 = DataLoader(dataset2, batch_size=15, shuffle=True)
dataiter2 = iter(train_loader2)
images2, labels2 = dataiter2.next()
print(images2.size())
torch.Size([15, 3, 128, 128])