본문 바로가기
딥러닝 머신러닝 데이터 분석/BoostCampAITech

[ BoostCamp ] Day-17 학습로그( PyTorch의 구조 학습 )

by SteadyForDeep 2021. 8. 20.
반응형

1) 강의 복습 내용

 

PyTorch는 nn.Module로 시작해서 nn.Module로 끝난다고 해도 과언이 아니다.

Pytorch 에서 가장 중요한 class는 nn.Module이다.

 

대부분의 layer들은 이 nn.Module의 자식들이고

거기서 훈련이 가능한 변수들은 nn.Parameter로 지정되어있다.

nn.Parameter로 지정된 변수들은 register 라는 곳에 저장되는데

이렇게 저장된 변수만이 auto-grad로 gradient를 계산할 수 있다.

 

가끔 임의로 텐서를 추가해서 계산을 해야하는 경우가 있는데

이럴때도 미분에 반드시 기여해야한다면 nn.Parameter로 register 시켜주는 것이 좋다.


데이터를 모델이 잘 먹이는 것도 참 큰 일이다.

TensorFlow 에서는 TFrecords 라는 방식을 이용해서 데이터를 분산 저장하고 불러올 수 있었는데

이정도 까지는 아니더라도 PyTorch의 Dataset과 DataLoader를 이용하면

효과적으로 전처리나 augmentation을 하고 minibatch로 묶어서 피딩이 가능하다.

 

그리고 PyTorch객체들로 표준화해서 코드를 작성하는 것이 가능한데

협업을 할때 편리할 기능이다.

 

2) 과제 수행 과정 / 결과물 정리

 

어려웠다...

 

pandas를 이용한 데이터를 DataLoader를 이용해서 원하는 배치로 만들어내는 것이 주된 과제였는데

이미지, text, 정형데이터 와 같이 굉장히 다양한 데이터를 다뤄볼 수 있게 문제들이 나왔다.


DataLoader는 collate_fn 을 지정해 줄 수 있는데

동적인 특성을 가지는 PyTorch 답게 자유롭게 데이터를 마사지할 수 있는 기능이었다.

특히 CIFAR-1000 같은 데이터는 서로 크기가 다른 이미지들이 모여있는데

이럴때 collate_fn을 이용해서 padding을 해준다거나 잘라준다거나 마사지를 하면 쉽게 데이터를 피딩할 수 있다.


torchvision을 이용해서 데이터를 처리하는 경우는

항상 PIL 객체로 받아서 다뤄야하는데 파이썬에서 이미지를 다루는 패키지인 pillow에서 사용하는 객체다.

이것까지 굉장히 pythonic 하다는 것을 알 수 있다.

그렇게 torchvision에서 제공하는 다양한 이미지 처리를

transforms에서 부터 불러와서 적용이 가능하고

transforms.Compose()로 묶어서 관리할 수 있다.

수치적으로 연산해야하거나 PIL 객체로는 할 수 없는 일이 있다면

ToTensor를 통해 PyTorch 의 텐서로 바꾸고 진행하면 된다.


AG_NEWS 데이터를 가지고 텍스트 전처리를 실습했는데 이게 가장 어려웠다.

torchtext의 utils를 사용해서 tokenize하는 과정이나

vocab 을 이용해서 사전을 만드는 과정이 없었으면 정말 손이 많이 갈 뻔했다.

물론 이게 있다고 난이도가 내려가는 것은 아니었다...

 

신기한 것은 Dataset을 정의할 때 필요한 method들을 모두 정의하고

collate_fn을 통해서 입력받은 객체의 method들을 활용하고

DataLoader에서 collate_fn을 설정해서 데이터를 로딩하는 방식이었다.

나같으면 collate_fn을 어떻게든 짜내보려고 애쓰면서 시간을 버렸을텐데

이런 부분을 많이 배웠다.

 

3) 피어세션 정리

 

4) 학습 회고

 

20210818

자동화된 테스트 툴(unit test, TDD)이 언제나 필요하다.

 

TDD : Test-Driven Development

순서

RED         : write as failing unit test

GREEN      : write production code to make test pass

REFACTOR : remove duplication and improve design


파이썬에서는 ? 

 

import unittest

 

class SimpleTest(unittest.TestCase):

    def testadd(self):

        self.assertEqual( add(4,5), 9 )

 

if __name__=='__main__':

    unittest.main()

 

이런식으로 구현한다.


머신러닝에서 Unite Test는?

 

 - 최소한의 기능만 담은 function을 추구해야함

 - compose method pattern

 - Extract method

 

인공지능 개발의 모든 단계가 모호한 단계는 아니다.

명확한 단계에서는 명확한 테스트 방식이 적용되어야한다.

Obvious : compare with expected results

Not : measure changes


테스트케이스를 정확하게 잘 만드는 것이 굉장히 중요하다.

불필요하게 동일한 테스트를 많이 하는 것은 낭비이므로 테스트케이스 관리가 굉장히 중요하다.

OOP에서는 isolate 된 객체의 테스트가 진행된 후에 integration level test까지 거치게 된다.

결국 unit 테스트가 중요하다.

 

Visualize 와 unit test는 다르다.

visualization은 하나의 feature 를 체크하는 방식이고

예를 들어 노드간의 정확한 결합을 테스트한다면

컨트롤 가능한 노드간의 연결을 이용해서 명확한 unit test가 가능해 지도록 해야한다.

반응형

댓글