모델이 학습을 하기 위해서는 일련의 과정이 필요하다.
optimzer.zero_grad(이전의 그라디언트 초기화)
loss = criterion(outputs, targets)
loss.backward() -> backpropagation 계산
optimizer.step() -> 업데이트
과정을 자세히 살펴보면 backward에서는 미분을 계산하고
backward
def backward(self, x, yhat, y): ## compute backward self.grads["dw"] = (1/x.shape[1]) * torch.mm(x, (yhat - y).T) self.grads["db"] = (1/x.shape[1]) * torch.sum(yhat - y)
optimize에서는 계산한 grad를 가지고 업데이트가 이루진다.
optimize
def optimize(self): ## optimization step self.w = self.w - self.lr * self.grads["dw"] self.b = self.b - self.lr * self.grads["db"]
class CustomDataset(Dataset):
def __init__(self,):
pass
def __len__(self):
pass
def __getitem__(self, idx):
pass
dataloader는 generater로 iter로 바꾼 후 next를 눌러야 값을 받을 수 있다. 이 때 batch size를 지정해주면 batch 수 만큼 데이터가 리턴된다.
sampler는 getitem 시 index를 통해서 값을 리턴하는데 이 index를 원하는 방식으로 설정을 하게 도와준다.
- SequentialSampler : 항상 같은 순서
- RandomSampler : 랜덤, replacemetn 여부 선택 가능, 개수 선택 가능
- SubsetRandomSampler : 랜덤 리스트, 위와 두 조건 불가능
- WeigthRandomSampler : 가중치에 따른 확률
- BatchSampler : batch단위로 sampling 가능
- DistributedSampler : 분산처리 (torch.nn.parallel.DistributedDataParallel과 함께 사용)
sub process의 개수를 설정하는 옵션, 큰 데이터일 때 유용. 하지만 너무 많이 하면 CPU와 GPU 사이에 병목이 일어날 수 있음
데이터 사이즈를 맞추기 위해 사용하는 방식. collate를 하면 feature끼리 label끼리 합쳐진다.
def my_collate_fn(samples):
collate_X = []
collate_y = []
max_len = 0
for dic in samples:
collate_y.append(dic['y'])
max_len = max(max_len, len(dic['X']))
for dic in samples:
if len(dic['X']) != max_len:
l = max_len - len(dic['X'])
dic['X'] = torch.cat((dic['X'], torch.zeros(l)), 0)
collate_X.append(dic['X'])
######################################TODO######################################
pass
################################################################################
return {'X': torch.stack(collate_X),
'y': torch.stack(collate_y)}
dataloader_example = torch.utils.data.DataLoader(dataset_example,
batch_size=2,
collate_fn=my_collate_fn)
이렇게 하면 데이터를 불러올 때, collate_fn이 실행이 되고 input으로는 리스트 안에 batch size 만큼 {'X': [], 'y':[]} , ...이 들어온다. 그렇게 받은 인풋으로 내가 설정을 한 값으로 리턴을 하는 식
이미지 데이터를 다룬다면 아마 많이 사용될 함수. Augmentation을 위해서 많이 사용한다.
torchvision.transforms.Resize(size,
interpolation=<InterpolationMode.BILINEAR: 'bilinear'>,
max_size=None,
antialias=None)
transforms.Resize(size = (200,200))(im)
torchvision.transforms.RandomCrop(size,
padding=None,
pad_if_needed=False,
fill=0,
padding_mode='constant')
transforms.RandomCrop(size = (100,100))(im)
torchvision.transforms.RandomRotation(degrees,
interpolation=<InterpolationMode.NEAREST: 'nearest'>,
expand=False,
center=None,
fill=0,
resample=None)
transforms.RandomRotation(30)(im)
한 번에 묶어서 쓰기
transforms.Compose([transforms.Resize((224,224)), transforms.RandomVerticalFlip(0.5), transforms.CenterCrop(150)])(im)