[U stage DAY 12] pytorch (2)

먼지감자·2021년 8월 18일
0

AI Boostcamp 2기

목록 보기
11/48

강의 내용 복습

(04강) AutoGrad & Optimizer

모델은 layer를 block처럼 쌓아 만든 것이다.
이를 위한 모듈이 torch.nn.Module이다.

torch.nn.Module
딥러닝을 구성하는 layer의 baseclass
input, output, forward, backward 정의
학습의 대상이 되는 parmeter(tensor)정의

nn.Parameter
Tensor객체의 상속객체
nn.Module 내에 attribute가 될때는 requires_grad = True 로 지정되어 학습대상이 되는 tensor
우리가 직접 지정할 일은 잘 없음(대부분의 layer에는 weights값이 지정되어 있음)

backward
layer에 있는 parameter들의 미분을 수행
forward의 결과값 (model의 output = 예측치)과 실제값간의 차이(loss)에 대해 미분을 수행
해당 값으로 parameter 업데이트

# backward 과정

# 기울기 초기화
optimizer.zero_grad()

# 모델예측
output = model(input)

# loss 계산
loss = criterion(outputs, labels)

# 파라미터의 기울기 값 계산
loss.backward()

# 가중치 업데이트
optimizer.step()

Further Question

  • epoch에서 이뤄지는 모델 학습 과정을 정리해보고 성능을 올리기 위해서 어떤 부분을 먼저 고려하면 좋을지 같이 논의해보세요

  • optimizer.zero_grad()를 안하면 어떤 일이 일어날지 그리고 매 batch step마다 항상 필요한지 같이 논의해보세요

    optimizer.zero_grad()는 dloss / dW 를 계산하기 전에 optimazer 안에 저장되어 있는값을 0으로 초기화하는 과정이다. 생략하게 된다면 기울기값에 쓰레기값이 들어가게 되어 가중치 업데이트가 제대로 되지 않는다. 따라서 매 step마다 필요하다.

(05강) Dataset & Dataloader

Dataset

  • 데이터 입력형태 정의하는 클래스
  • 데이터를 입력하는 방식의 표준화
  • Image, Text, Audio 등에 따른 입력정의

torch의 Dataset을 상속받는 CustomDataset class는 init, len, getitem으로 구성된다.

import torch
from torch.utils.data import Dataset, DataLoader

class CustomDataset(Dataset):
    # 초기데이터 생성방법 지정
    def __init__(self, text, labels):
            self.labels = labels
            self.data = text
	
    # 데이터의 전체길이 반환
    def __len__(self):
            return len(self.labels)

    # index값을 주었을 때 반환되는 데이터의 형태(X,y)
    def __getitem__(self, idx):
            label = self.labels[idx]
            text = self.data[idx]
            sample = {"Text": text, "Class": label}
            return sample

Dataset class 생성 시 유의점

  • 데이터 형태에 따라 각 함수를 가르게 정의함
  • 모든 것을 데이터 생성시점에 처리할 필요는 없음 : image의 Tensor변화는 학습에 필요한 시점에 변환
  • 데이터셋에 대한 표준화된 처리방법 제공 필요 : 협업 시 필수
  • 최근에는 HuggingFace등 표준화된 라이브러리 사용

DataLoader 클래스

  • Data의 Batch를 생성해주는 클래스
  • 학습직전 (GPU feed전) 데이터의 변환을 책임
  • Tensor로 변환 + Batch처리가 메인업무
  • 병렬적인 데이터 전처리 코드의 고민 필요
MyDataLoader = DataLoader(MyDataset, batch_size=2, shuffle=True)
# 배치데이터 가져오는 방법 1
next(iter(MyDataLoader))

# 방법 2
for dataset in MyDataLoader:
    print(dataset)

argument

  • dataset
    index로 데이터를 참조하는 map-style dataset(getitem, len)과 iter로 참조하는 Iterable style dataset(iter)이 있다.
    Iterable style dataset은 stream data, real-time log와 같이 random으로 읽기에 어렵거나, data에 따라 batch size가 달라지는 데이터(dynamic batch size)에 사용한다.

  • batch_size : int, optional, default=1
    배치(batch)의 크기, dataset에서 return하는 데이터는 tensor이므로 만약 tensor로 변환이 안되는 데이터는 에러가 난다.

  • shffle : bool, optional, default=False
    데이터를 DataLoader에서 섞어서 사용하겠는지를 설정

  • sampler : Sampler, optional
    데이터의 index를 원하는 방식대로 조정. map-style에서 컨트롤하기 위해 사용된다.

  • batch_sampler : Sampler, optional
    위와 동일

  • num_workers : int, optional, default=0
    데이터 로딩에 사용하는 subprocess개수 (멀티프로세싱)
    기본값이 0인데 이는 data가 main process로 불러오는 것을 의미한다.

  • collate_fn : callable, optional
    map-style 데이터셋에서 sample list를 batch 단위로 바꾸기 위해 필요한 기능. zero-padding이나 Variable Size 데이터 등 데이터 사이즈를 맞추기 위해 많이 사용한다.

  • pin_memory : bool, optional
    True 일 때 데이터로더는 Tensor를 CUDA 고정 메모리에 올린다.

  • drop_last : bool, optional
    batch 단위로 데이터를 불러올 때 마지막에 남는 batch의 길이가 설정한 batch보다 작을 경우 사용. 특히 batch의 길이가 다른 경우에 따라 loss를 구하기 귀찮은 경우, batch의 크기에 따른 의존도 높은 함수를 사용할 경우

  • time_out : numeric, optional, default=0
    양수로 주어지는 경우, DataLoader가 data를 불러오는데 제한시간

  • worker_init_fn : callable, optional, default=’None’
    num_worker가 개수라면, 이 파라미터는 어떤 worker를 불러올 것인가를 리스트로 전달

Further Question

  • DataLoader에서 사용할 수 있는 각 sampler들을 언제 사용하면 좋을지 같이 논의해보세요!

  • 데이터의 크기가 너무 커서 메모리에 한번에 올릴 수가 없을 때 Dataset에서 어떻게 데이터를 불러오는게 좋을지 같이 논의해보세요!


Ref

https://pytorch.org/docs/stable/data.html
https://subinium.github.io/pytorch-dataloader/


과제 수행 과정 및 결과

Custom Dataset 및 Dataloader 생성
Dataset 관련 모듈

Dataset 관련 모듈 알아보기


PyTorch에서 데이터를 다루기 위한 몇 가지 모듈
1. torch.utils.data : 데이터셋의 표준을 정의하고 데이터셋을 불러오고 자르고 섞는데 쓰는 도구들이 들어있는 모듈. 파이토치 모델을 학습시키기 위한 데이터셋의 표준을 torch.utils.data.Dataset에 정의. Dataset 모듈을 상속하는 파생 클래스는 학습에 필요한 데이터를 로딩해주는 torch.utils.data.DataLoader 인스턴스의 입력으로 사용.
2. torchvision.dataset : torch.utils.data.Dataset을 상속하는 이미지 데이터셋의 모음. MNIST나 CIFAR-10과 같은 데이터셋을 제공.
3. torchtext.dataset : torch.utils.data.Dataset을 상속하는 텍스트 데이터셋의 모음. 기본적으로 IMDb나 AG_NEWS와 같은 데이터셋을 제공.
4. torchvision.transforms : 이미지 데이터셋에 쓸 수 있는 여러 가지 변환 필터를 담고 있는 모듈. 예를 들어 Tensor로 변환한다던지, 크기 조절(Resize)과 잘라내기(Crop)으로 이미지를 수정할 수 있고 밝기(Brightness)와 같은 값을 조절하는데 사용.
5. torchvision.utils : 이미지 데이터를 저장하고 시각화하기 위한 도구가 들어있는 모듈.

참고: 펭귄브로의 3분 딥러닝, 파이토치맛

Custom Dataset class

  • torch.utils.data.Dataset 상속
  • init : 데이터의 위치나 파일명과 같은 초기화 작업을 위해 동작
    CSV파일이나 XML파일과 같은 데이터를 이때 불러온다. 이렇게 함으로써 모든 데이터를 메모리에 로드하지 않고 효율적으로 사용할 수 있다. 여기에 이미지를 처리할 transforms들을 Compose해서 정의한다.
  • len : Dataset의 최대요소 수를 반환하는데 사용
    현재 불러오는 데이터의 인덱스가 적절한 범위 안에 있는지 확인할 수 있다.
  • getitem : 데이터셋의 idx번째 데이터를 반환하는데 사용
    일반적으로 원본 데이터를 가져와서 전처리하고 데이터 증강하는 부분이 모두 여기에서 진행된다.

Data Loader
모델 학습을 위해서 데이터를 미니 배치(Mini batch)단위로 제공해주는 역할

DataLoader(dataset,            # Dataset 인스턴스가 들어감
           batch_size=1,       # 배치 사이즈를 설정
           shuffle=False,      # 데이터를 섞어서 사용하겠는지를 설정
           sampler=None,       # sampler는 index를 컨트롤
           batch_sampler=None, # 위와 비슷하므로 생략
           num_workers=0,      # 데이터를 불러올때 사용하는 서브 프로세스 개수
           collate_fn=None,    # map-style 데이터셋에서 sample list를 batch 단위로 바꾸기 위해 필요한 기능
           pin_memory=False,   # Tensor를 CUDA 고정 메모리에 할당
           drop_last=False,    # 마지막 batch를 사용 여부
           timeout=0,          # data를 불러오는데 제한시간
           worker_init_fn=None # 어떤 worker를 불러올 것인가를 리스트로 전달
          )
 
dataloader_custom = DataLoader(dataset_custom)

피어 세션


학습 회고

keep

할일을 모두 끝내고 자자

problem

앞으로 원활한 학습을 위해 해야할 것들은 많아지는데 하지못하고 있다.

try

해야할 일을 차근차근 해보자

profile
ML/AI Engineer

0개의 댓글