부스트캠프 AI Tech 4기 Week 2

Geonhee Sim·2022년 9월 30일
0

학습 내용

2주차는 PyTorch의 특징과 다양한 함수 쓰는 법, 그리고 Custom Dataset과 DataLoader를 구현하는 방법을 배우고 익혔다. 그 방대한 내용 중 일부만 정리해본다.

PyTorch

딥러닝 프레임워크에는 대표적으로 Keras, Tensorflow, PyTorch가 있다.
최근에 발표되는 논문에서 프레임워크 사용 경향을 살펴보면, PyTorch의 사용 비중이 높아지고 있다고 한다. 왜냐하면 상대적으로 빠르며, dynamic computation graphs로 인해 디버깅이 쉽기 때문이다.
Tensorflow는 static graphs를, PyTorch는 dynamic computation graphs(DCG)를 생성한다.
static graphs는 그래프를 먼저 정의 하고 실행(Define and Run)하는 방식이어서 실행시점에 직접 데이터를 feed 해줘야 한다. 그래서 feed 해준 이후에만 값을 확인할 수 있다. 반면 DCG는 실행을 하며 그래프를 생성(Define by Run)하여 변수 값을 원할 때 바로 확인할 수 있어 디버깅에 유용하다.
이 외에도 PyTorch는 Numpy 구조와 비슷한 Tensor 객체로 모델을 구성하여 다루기 쉬우며, 자동미분을 지원해준다는 장점이 있다.

PyTorch Project Template

여러가지가 있는데, 그 중에 선택해서 사용하면 된다.
추천해주신 템플릿

gather

이번 주차에 배웠던 torch 함수 중 이해하기 가장 어려웠던 함수였다.😂
사이트를 보고 직접 손으로 구해보며 힘들게 이해할 수 있었다.

Dataset

torch.utils.data에서 Dataset클래스를 상속하여 만든 Dataset 클래스는 기본적으로 아래와 같이 세가지 메서드로 구성되어 있으며, 이와 같은 구조는 map-style dataset일 때에만 가능하다.

from torch.utils.data import Dataset

class CustomDataset(Dataset):
    def __init__(self,):
        pass
        
    def __len__(self):
        pass
    
    def __getitem__(self, idx):
        pass
    

__init__ 메서드는 데이터 로드 등의 초기화 작업을 수행한다. 이미지의 경우 처리할 transfomrs들을 이곳에서 정의한다.
__len__ 메서드는 Dataset의 최대 요소 수를 반환한다.
__getitem__ 메서드는 원하는 idx의 데이터셋을 반환한다. 데이터를 가져와 전처리 하는 작업도 여기에서 수행한다.

DataLoader

Dataset이 단일 데이터에 대해서였다면, DataLoader는 미니 배치(Mini batch) 단위로 데이터를 제공해준다.

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
           batch_sampler=None, num_workers=0, collate_fn=None,
           pin_memory=False, drop_last=False, timeout=0,
           worker_init_fn=None)

많은 인자가 존재하는데, 그 중 dataset에 앞서 만든 Dataset을 넣어주면 된다.
collate_fn은 데이터-라벨 형태로 묶여있는 데이터를 각각 데이터, 라벨 그룹으로 나누거나, Variable Size의 데이터를 padding을 통해 통일된 사이즈로 만들기 위해 많이 사용한다.

GPU 에러

GPU 에러들을 정리해둔 사이트

과제

이번 주차 과제 분량이 정말 많았다.😂😂 우선 늦지 않게 과제 제출하는 것에 집중해서 읽지 못하고 넘어갔던 자료들이 많아서 하면서 너무 아쉬웠다.. 주말 동안 보충할 생각이다.
분량이 많아서 힘들었지만, 그만큼 새로 배운 많은 내용들을 실습을 통해 빨리 받아들일 수 있었다.
MNIST, AG_NEW, 그리고 Titanic 데이터로 커스텀 Dataset과 DataLoader를 직접 만들어볼 수 있었다. 그 동안 오픈된 모델을 단순히 가져와서 적용하거나 돌려보는 것만 해봤었는데, 비록 데이터를 로드하는 부분만이지만 직접 구현해볼 수 있었다.

피어세션

이번 주 부터는 확률론 스터디도 시작했다. 하버드 확률론 기초 강의 1~2강을 수강했다. naive한 확률 정의와 non-naive한 확률 정의, 그리고 story proof에 대한 내용이 수록되어 있었는데, 초반 강의인 만큼 간단한 내용이어서 금방 끝나고 남은 시간 동안은 강의 및 과제 내용에 대한 질의응답이 오갔다.
금주의 알고리즘 스터디에서 나는 DP 문제를 풀었었고, 각자 플로이드 워셜, 그래프 탐색, 그리고 Priority Q(heapq) 문제를 풀어왔다. 리스트의 중간 원소를 del 할 경우 heapq 구조가 깨지는 현상에 대해서 질의응답이 오갔다.

학습회고

이번 주는 제시간에 과제를 다 푸는 데에 집중했고, 과제 제출과 동시에 바로 스터디를 준비하느라 조원들과 과제 코드 리뷰를 함께 하지 못해서 아쉬웠다. 그래서 원래 수목이었던 스터디들을 월화로 옮겼다. 과제를 제출하고 함께 코드를 리뷰하는 시간을 갖자는 취지에서였다.
공부할 건 너무 많은데 마음만큼 빨리 내용이 익혀지는 않고, 이번에는 과제에 너무 시간을 쏟아부어서 다른 부분에 대해 신경을 많이 못 쓴 것 같아 아쉬웠다. (예를 들어 이번 주 부터는 매일매일 그날 공부한 내용을 간단하게라도 정리해보자는 목표가 있었는데..) 주말동안 이번 주 배운 내용과 지나쳤던 내용들을 다시 복습해보며 더한 태풍이 휘몰아칠 것으로 예상되는😁 다음주를 대비하도록 하자...

profile
기록이란 걸 해보자

0개의 댓글