[U_stage] - week3

eric9687·2021년 8월 20일
1

[Day1] 2021/08/17

강의 리뷰

-PyTorch 1강: Introduction to PyTorch

  • 대표적인 딥러닝 프레임워크:

    출처: https://datasciencecareer.wordpress.com/2020/12/09/ml03%20ml03-pytorchpytorch-vs%20-tensorflow/
  • TF: Define and Run: 그래프 정의 -> 실행시점에 데이터 feed.
  • PyTorch: Define by Run - 실행하면서 그래프를 생성하는 방식. 즉시 확인 가능 - pythonic community. GPU support. Good API and community. 사용하기 편한 장점이 가장 큼.
    • Numpy + Autograd + Function
    • 다양한 형태의 DL을 지원하는 함수와 모델을 지원함

-PyTorch 2강: PyTorch Basics

  • Tensor: 다차원의 Arrays를 표현하는 Pytorch 클래스. 데이터타입은 numpy와 동일. GPU에 올려서 사용가능.
    • reshape 대신 view
    • squeeze : 차원의 개수가 1인 차원을 삭제
    • unsqueeze : 차원의 개수가 1인 차원을 추가
    • mm: 행렬곱셈 연산, broadcasting 지원하지 않음
    • nn.functional 모듈을 통해 다양한 수식 변환 지원.
    • backward : 자동 미분 지원

-PyTorch 3강: PyTorch 프로젝트 구조 이해하기

  • 개발 초기에는 대화식 개발과정이 유리하지만 배포나 공유에 있어서는 notebook은 어려운 부분이 있다.
  • OOP + ahebf = 프로젝트
  • 실행, 데이터, 모델, 설장, 로깅, 지표, 유틸리티 등 다양한 모듈들을 분리하여 프로젝트 템플릿화
  • 모듈 구성

    출처: https://github.com/victoresque/pytorch-template

과제

: Custom Model 개발하기 - Pytorch의 tensor 조작과 Model 기본 구조 만들기

(시간을 많이 끌었던 부분 정리! 그 외는 과제 참고)

  • torch.index_select()
A = torch.Tensor([[1, 2],
                  [3, 4]])
indices = torch.tensor([0])
output = torch.index_select(A,1,indices)   #출력:tensor([[1., 3.]])
  
  • torch.gather()
  # 2D tensor에서 대각선 요소 가져오기
output = A
indices = [0,1]
indices = torch.tensor(indices).unsqueeze(axis=-1)
output = torch.gather(output,1,indices)   # indices의 차원과 gather함수에 입력하는 차원을 잘맞춰야한다!! 
output = torch.transpose(output,0,1)      #출력:tensor([1  4])

피어세션

  • 학습관련 Q&A
    1. SGD 구현에서 Label이 random shuffle되지 않고 sorted되어있더라도, SGD의 기본원리에 따라 학습이 잘 될까?: sigmoid함수의 특징 상 label이 동일하면 gradient값이 0이 되어 성능이 떨어질 것 같다.
    2. NN 구현에서 ReLU를 적용하면 음의 무한대로 발산하던데 이유를 모르겠다.: Activation Function을 바꾸면 learning rate도 바꿔줘야 한다. ReLU에서 편미분값이 양수일 때 lr이 너무 크다면 w, b를 너무 많이 줄이게 되면서 음의 무한대로 발산할 수 있다.
  • 다른 캠퍼분의 Numpy로 Neural Network구현
    : 진짜 멋있음...

마무리

  • 특강(라이엇 게임즈 유석문 CTO) 개발자로 산다는 것
    : 좋은 개발자가 되기 위해선 코드를 깔끔하게 쓰는 연습을 시작으로 하자.. 그리고 기 죽지말고 열심히 꾸준히 하라고 하셨다.
  • 다른 캠퍼분께서 연휴동안 numpy로 NN을 구현한 것을 보고 감탄했고 경각심이 생겼다. 다들 열정 한가득이셔서 동기부여가 된다.

[Day2] 2021/08/18

강의 리뷰

-PyTorch 4강: Autograd & Optimizer

  • nn.module
    • 딥러닝을 구성하는 layer의 base class
    • Input, output, forward, backward 정의
    • 학습의 대상이 되는 parameter(tensor)정의
  • nn.Parameter
    • Tensor의 상속 객체
    • nn.module 내에 attribute가 될 때는 required_grad = True로 지정되어 학습 대상이 되는 Tensor
    • 대부분의 layer에는 weights 값들이 지정되어 있어 직접 지정할 일은 잘 없음
  • Backward
    • layer에 있는 parameter들의 미분을 수행
    • forward의 결과값 (model의 output= 예측치)과 실제값간의 차이(loss)에 대해 미분을 수행
    • 해당 값으로 Parameter 업데이트
  • Backward from the scratch
    • 실제 backward는 Module 단계에서 직접 지정가능
    • Module에서 backward와 optimizer오버라이딩
    • 사용자가 지접 미분 수식을 써야하는 부담 -> 쓸일은 없으나 순서는 이해할 필요가 있음

-PyTorch 5강: Pytorch Dataset

  • Dataset 클래스
    • 데이타 입력 형태를 정의하는 클래스
    • 데이터를 입력하는 방식의 표준화
    • Image, Text, Audio 등에 따른 다른 입력 정의
  • Dataset 클래스 생성시 유의점
    • 데이타 형태에 따라 각 함수를 다르게 정의함
    • 모든 것을 데이터 생성 시점에 처리할 필요는 없음
      :image의 Tensor변화는 학습에 필요한 시점에 변환
    • 데이타 셋에 대한 표준화된 처리방법 제공 필요
    • 최근에는 HuggingFace등 표준화된 라이브러리 사용
  • DataLoader 클래스
    • Data의 Batch를 생성해주는 클래스
    • 학습 직전 데이터의 변환을 책임짐
    • Tensor로 변환 + Batch 처리가 메인 업무
    • 병렬적인 데이터 전처리 코드의 고민 필요

과제

: Custom Dataset 만들기 - Dataset을 구현해보고 dataloader로 조작해보기
(전체적인 내용은 과제에서 참고, 시간 많이 끌었던 부분만 정리!)

  • 판다스 데이터를 가져올때는 판다스의 특성을 생각해야한다!!!! .iloc 주의!
   def __init__(self, path, drop_features, train=True):
        self.data = pd.read_csv(path)
        		  .
  		          .
  			  .
        for drop in drop_features:
          self.data = self.data.drop(drop,axis = 1)
        self.X = self.data.drop('Survived',axis = 1)
                   .
                   .
                   .
  def __getitem__(self, idx):
        X, y = self.X.iloc[idx], self.y.iloc[idx]  ## 여기!
        pass
        return torch.tensor(X), torch.tensor(y)
  • 데이터셋의 transform은 __getitem___에서!!
  class MyMNISTDataset(Dataset):
    def __init__(self, path, transform, train=True):
        
  					...
        self.transform = transform
        
  					...

    def __getitem__(self, idx):
        X,y = self.transform(self.images[idx]), self.labels[idx]
        return torch.tensor(X, dtype=torch.double), torch.tensor(y, dtype=torch.long)
  
  

피어세션

  • 학습관련 Q&A
    1. class의 상속에서 super의 사용 이유? nn.Module에서 super.init()이란? : https://algopoolja.tistory.com/39
    2. hook이란? : 모델을 실행시키면서 자기가 만든 custom 함수를 중간에 실행시킬 수 있도록 하는게 hook.

마무리

  • 특강(라이엇 게임즈 유석문 CTO) Unit Test
    : Unit Test의 개념을 처음으로 알게된 시간이였다. Unit Test라는 것은 직접 디버깅할 필요없이 코드 추가/수정할때 문제점을 직관적으로 찾을 수 있는 방법인데 아주 좋은 아이디어고, 활용해보고 싶다.
  • 과...제가 갑자기 양이 너무 많아졌다.. 효율적 시간 분배가 필요해 보인다.

[Day3] 2021/08/19

강의 리뷰

-PyTorch 6강: 모델 불러오기

  • model.save()
    • 학습의 결과를 저장하기 위한 함수
    • 모델 형태(architecture)와 파라메터를 저장
    • 모델 학습 중간과정의 저장을 통해 최선의 결과모델을 선택
    • 공유
  • Checkpoints
    • 학습의 중간 결과를 저장하며 최선의 결과를 선택
    • earlystopping기법 사용시 이전 학습의 결과물을 저장
    • loss와 metric값을 지속적으로 확인 저장
    • 일반적으로 epoch, loss, metric을 함계 저장하여 확인
    • colab에서 지속적인 학습을 위해 필요
  • Transfer Learning
    • 다른 데이터셋으로 만든 모델(pretrained)을 현재 데이터에 적용
    • 대용량 데이터셋으로 만들었기때문에 모델 성능이 좋음
    • freezing: pretrained model을 활용시 모델의 일부분을 frozen시킨다.

-PyTorch 7강: Monitoring tools for PyTorch

  • Tensorboard와 weight&biases 로 print를 대체하자!
  • Tensorboard: Tensorflow의 프로젝트로 만들어진 시각화 도구, 학습 그래프, metric, 학습결과를 시각화, Pytorch에서도 사용 가능.
    • scalar: metric(ACC,Loss,Precision,Recall)을 epoch에 따라 표현
    • graph: 모델의 computational graph 표시
    • histogram: weight값 분포
    • image: 예측값과 실제값을 비교 표시
  • weight & biases
    • 머신러닝 실험에 많이 쓰이며, 협업,code versioning, 실험결과 기록 등 제공, MLOps의 대표적인 툴로 저변확대중.

과제

: 화,목의 필수과제[Custom Model]과 필수과제[Custom Dataset] 마무리..
(정말 시간 많이 잡아 먹었다....)

피어세션

  • 학습관련 Q&A
    1. dropout의 원리
  • 알고리즘 문제풀이: DP (다른 캠퍼님)

마무리

  • 마스터클래스 (최성철 교수님)
    앞으로 알아야할 것 들-MLOPs 도구들
    -당연히 데이터베이스 -Cloud
    -AWS, GCP, Azure-Spark (+ Hadoop)
    -Linux + Docker + 쿠버네티스
    -스케줄링 도구들 (쿠브플로우, MLFlow, AirFlow)
  • 개인 멘토링: 개인 솔루션을 받는 시간이였던 것 같다. 학습 내용도 어려운 것이 많지만 학습방법에 어려움이 있다고 생각했는데, 멘토님께서 질문에 대한 두려움을 깨주시면서 해결 의지가 생겨나서 너무 다행이다. 앞으로 질문 많이 해야지 ㅎ

[Day4] 2021/08/20

강의 리뷰

-PyTorch 8강: Multi-GPU 학습

GPU를 사용하는 방식은 Model parallel과 Data parallel이 있다.

  • Model parallel: 모델의 병목, 파이프라인의 어려움때문에 잘 쓰지 않음.
  • Data parallel: 데이터를 나눠 GPU할당후 결과의 평균.
    • DataParallel - 단순한 데이터 분배후 평균. GPU 사용 불균형, batch size 감소
    • DistributedDataParallel - 각 CPU마다 process 생성하여 개별 GPU에할당. DataParallel과 비슷하나 개별적 연산 평균.

-PyTorch 9강: Hyperparameter Tuning

  • learning rate, 모델의 크기, optimizer등을 지정
  • 학습 성능: 데이터 >> 모델 > Hyperparameter
  • grid search, random search방법이 있지만 , 최근은 베이지안 기법이 쓰임.
  • Ray: multi-node multi processing 지원 모듈. 병렬식.

-PyTorch 10강: Troubleshooting

  • OOM이 왜,어디서 발생했는지 알기 어려움...
  • batch size를 줄여보기.
  • GPUtil을 통해서 상태를 확인하기.
  • torch.cuda.empty_cache() 써보기.
  • trainning loop에 tensor로 축적되는 변수 확인.
  • 필요가 없어진 변수는 적절한 삭제가 필요.
  • Inference시점에 torch.no_grad()사용.

과제

  • 선택과제 Transfer Learning & Hyper Parameter Tuning
    • 반복 강조된 부분: 분류 모델의 output 크기가 1000개로 되어 있음으로 mnist data class 개수로 나올 수 있도록 Fully Connected Layer를 변경하고 xavier uniform으로 weight 초기화
MNIST_CLASS_NUM = 10 # MNIST CLASS NUM은 몇 개일까요?
mnist_resnet18.fc = torch.nn.Linear(in_features=512, out_features=MNIST_CLASS_NUM, bias=True) # resnet18.fc의 in_features의 크기는?
torch.nn.init.xavier_uniform_(mnist_resnet18.fc.weight)
stdv =  1. / math.sqrt(mnist_resnet18.fc.weight.size(1))  # fully connected layer의 bias를 resnet18.fc in_feature의 크기의 1/root(n) 크기의 uniform 분산 값 중 하나로 설정해주세요! 
mnist_resnet18.fc.bias.data.uniform_(-stdv, stdv)

피어세션

스페셜 피어세션

:이번 과제가 나만 시간 소요가 많았고 힘들었다고 생각했는데 다른 분들도 그렇다는 걸 알면서 자존감 회복이 되었다. 그렇다고 안심하고 있지만은 말 것! 그리고 다른 조는 논문리뷰?도 하시는 것 같은데 좋은 학습방법 같았다.

팀 피어세션

  • 팀 회고록 작성
    : 개인별 발표하고 싶은 내용을 연구해오셔서 너무 감사했고 동기부여 또한 됐다.
  • P stage를 더 효율적으로 할 수 있기 위한 계획

마무리

  • 오피스아워: 필수과제 및 선택과제 해설
  • 어제 과제하느라 잠을 거의 못 잤는데 다른 피어분들의 동지애?(나만 느끼는 건지 모르겠지만 )덕분에 정신차리고 할 수 있었던 것 같다. 다음 주 부터는 Pstage에 들어서는데 다들 서로를 위해서 한가지씩 공부해오기로 하셨다.. 나는 정하지 못 했지만 주말동안 계획을 세워봐야겠다. 다음주도 파이팅있게 잘 할 수 있길..!
profile
그러나 먼저 된 자로서 나중되고 나중 된 자로서 먼저될 자가 많으니라(마:19:30)

0개의 댓글