BoostCamp

2021.08.25 - [Week 4] Day 3. 대회 진행 중 (2)

배기니어 2021. 8. 27. 20:19

공부한 내용

1. Model

 1.1. Model

  • 정의 : 시스템을 정보로써 표현하는 방식

  • 딥러닝의 모델 : 어떤 변환 과정을 통해 원하는 형태의 output을 내는 시스템을 표현하는 방식

  • 이미지 : 시각적인 표현의 인공물

  • 이미지 분류 모델 : 이미지를 변환하여 원하는 category class로 차원을 바꾸는 시스템

 

 1.2. PyTorch

  1.2.1. PyTorch

   • pythonic하고, training 과정의 요소를 공부하기 좋다.

   • Low-level

    - Low-level, pythonic, flexibility, dynamic graph

    - 수정이 용이하고 실험할 수 있는 것이 많다.

    - logic 추가가 쉽다.

    - training process 코드를 통해 training 과정을 이해할 수 있다.

   • pythonic

    - load_state_dict() 함수로 다른 model을 불러올 수 있다.

    - python의 dictionary 사용

    - 같은 구조의 model이라면 parameter 그대로 가져와서 사용 가능

 

  1.2.2. nn.Module

   • model이 갖는 module (convolution layer, relu, activation function, ...)

   • module은 저장소 개념

   • module 동작 방식을 알아야 model을 이해할 수 있다.

 

  1.2.3. modules

   • parameter를 저장하는 저장소 개념

   • 저장된 parameter 통해 forward 연산

   • modules는 module 객체에 존재하는 모든 module을 생성하면서 반환하는 함수

   • 모든 module의 child module까지 출력한다.

   • modules로 print해서 model 구조 및 사용 module 파악 가능

   • modules로 출력되는 module들은 model의 parameter를 가지고 있다.

   • modules로 model 저장, 불러오기 가능

   • backward시 parameter update 과정은 moduels 기반으로 수행

 

  1.2.4. forward

   • model(module)이 호출되면 실행되는 함수

   • nn.Module 상속시 정의해야할 함수 : __init__, forward

   • forward : input이 output이 되는 chain

   • model(input)과 model.forward(input) 동일

   • modules의 parameter들이 forward 연산에 사용된다.

 

  1.2.5. nn.Module 상속

   • 모든 nn.Module은 chile modules 가질 수 있다.

   • model에 연결된 모든 module 확인할 수 있고 forward 연산 사용 가능

   • model 정의 순간에 전체 module의 forward 함수가 연결

 

  1.2.6. Parameters

   • tensor base의 class

   • model의 modules에 존재하는 parameter(tensor)

   • module의 parameter 확인 가능
   • model.state_dcit() : key와 tensor로 구성된 dictionary

   • list(model.parameters()) : tensor list

   • 각 parameter들은 data, grad, requires_grad를 멤버로 가지고 있다.

    - data : tensor

    - grad : gradient

    - requires_grad : gradient를 update할지 결정, 특정 layer freeze 가능(training에 이용 X)

 

2. Pretrained Model

 2.1. Computer Vision

  • ImageNet dataset의 등장으로 비약적인 발전

  • ImageNet

   - 대용량의 dataset

   - 1400만 장의 image, 2만 개의 class -> 일반화된 많은 종류의 data로 만들어진 dataset

   - 큰 variance를 가진 대용량의 dataset을 통해 실생활에 적용 가능한 model인지 검증 가능

 

 2.2. Pretrained Model

  • model generalization을 위해서는 대용량의 datset이 가장 좋다.

  • 대용량 data 학습은 비효율적이거나 불가능

  • 미리 학습된 data를 문제에 맞게 적용하여 시간 절약

  • torchvision.models : 검증된 성능의 model

  • timm : torchvision보다 다양하고, 변칙적인 실험을 한 model

 

 2.3. Transfer Learning

  • pretrained model을 가져와서 나의 문제에 적용

  • backbone : 기본 골격이 되는 model 구조, feature 추출

  • classifier : 학습 결과를 class로 분류, 추출된 feature 바탕으로 새로운 class 정의

  • fc == fully connected layer == classifier

  • pretrained model이 학습 과정에서 정의한 문제와 나의 문제와의 연관성 확인 필요

  • Case by Case

   - similarity : pretrained model의 task와 내 task의 유사성

   - high similarity & large dataset

    · Feature Extraction

    · task가 비슷한 경우 backbone의 update까지는 필요 없다.

    · backbone는 고정적이고 classifier만 내 task에 맞는 class로 구분할 수 있도록 학습

   - low similarity & large dataset

    · Fine tuning : 미세 조정

    · task가 달라 backbone이 내 task에 맞는 feature 추출할 가능성 낮음

    · backbone과 classifier 모두 학습

    · similarity 낮아도 data가 많다면, no base로 학습하는 것보다 pretrained weight 바탕으로 학습하는 것이 속도 빠르고 좋은 결과 기대할 수 있다.

   - high similarity & small dataset

    · 적은 dataset으로 전체를 trainable하게 했을 때, data를 제대로 반영하지 못할 확률이 크다.

    · classifer만 학습해서 분류하는 작업만 학습하면 그나마 괜찮은 성능이 나온다.

   - low similarity & small dataset

    · pretrained model 사용하면 아무것도 되지 않거나 overfitting, underfitting될 가능성 높다.

    · pretrained model도 어느정도 조건이 갖춰져야 활용 가능

  • 내 task와 model이 만들어지게 된 task의 연관성, data 양 고려해서 전략을 수립해야 한다.

 

3. Special Mission

 • Labeling class 구현

  - attribute

   ‣ path : train data directory path, train data dataframe, mask 정보 포함된 train dataframe

   ‣ data : train dataframe

   ‣ df : mask 정보 포함된 train dataframe

  - method

   ‣ _make_dataframe : mask 정보 포함된 train dataframe 생성

   ‣ _get_img_file_list : image directory내의 image file 중 '.'로 시작하지 않는 파일 리스트 반환

   ‣ _make_mask_data : 이미지에 따라 mask 착용 여부 반환

   ‣ _merge_mask_data : 기존 dataframe과 mask 정보 포함한 dataframe 병합

   ‣ _check_age : 나이 판별

   ‣ _check_gender : 성별 판별

   ‣ _check_mask : 마스크 착용 여부 판별

   ‣ _labeling : 1개 데이터에 대해 label 생성

   ‣ labeling : 전체 데이터에 대해 label 일괄 생성

   ‣ to_csv_file : mask 정보 포함된 dataframe을 csv file로 저장

 

 • Dataset class 구현

  - attribute

   ‣ data : train dataframe

   ‣ X : train data PIL image list

   ‣ y : triain data label list

   ‣ features : feature list (age, gender, mask)

   ‣ classes : labels (0~17)

   ‣ train : train data 여부

   ‣ transform : transforms 요소

  - method

   ‣ _read_images : directory 내 image들의 list 반환

   ‣ _read_labels : label들의 list 반환

   ‣ __len__ : dataset 크기 반환

   ‣ __getitem__ : 인덱스에 맞는 data를 tensor로 반환

   ‣ get_image : 이미지 확인을 위한 method

 

4. 피어세션

https://bagineer.notion.site/level1-22-Day-17-08-25-4368f84e56d94e23aa367494c8f2f0da

 

level1-22 Day 17 (08/25) 피어세션 회의록

1. 대회 진행 사항

bagineer.notion.site

 

5. 멘토링

 5.1. 대회 진행 상황

  • pretrained model 사용, centercrop -> test set에서 성능이 떨어지는 문제

   - 데이터 분포가 test와 valid가 맞지 않아서 발생할 수 있다.

  • data에 다양한 augmentation 주는 방법도 있다.

  • task마다, dataset마다 맞는 augmentation이 있고 필요없는 augmentation이 있다.

  • crop이 좋지 않다는 소문이 있다.

  • 코드 리뷰

  • 외부 dataset 사용해보는 것도 좋은 방법

   - mask dataset

   - 서양 사람의 data여서 분포가 달라 방해가 될 수 있다.

   - generalization 고려해서 일부만 사용하는 것이 좋을 것 같다.

  • baseline 짜보는 것이 대회 목적

  • wandb 사용법

  • pair programming 권장

   - 둘이서 같이 프로그래밍하며 공부하기

   - 각자 다른 코딩 스타일 배울 수 있고 모르는 부분 공부할 수 있다.

   - naming convention, algorithm 등 배울 수 있다.

   - 효율적인 코딩 가능

 

 5.2. Self Supervised Learning

  • GPT 계열에서 많이 쓰이는 방법

  • Unsupervised Learning : label이 없는 dataset

  • hidden layer를 잘 학습하는 것이 목적

  • pretext task 먼저 학습

   - e.g. 문장의 감정을 파악하는 task에 앞서 문장의 단어를 가리고 단어를 예측하는 task 학습

   - e.g. 이미지 분류 task에 앞서 이미지가 몇 도로 rotation(augmentation) 되었는지 예측하는 task 학습

   - 쉬운 문제부터 풀고 어려운 문제 해결하는 방식

   - hidden layer에서 data의 전체적인 이해

  • label이 없는 data에 적용 가능한 장점

  • 핵심 아이디어는 pretext learning 후 transfer learning 적용

  • pretext learning은 fc layer만 추가해서 원하는 task 학습

  • pretext task에 적용할 수 있는 아이디어 고민해보기

  • 마스크 dataset은 cut-mix활용 시 그냥 사용하는 것보다 세로로 잘라 붙이는 것이 효과적일 것

  • 일요일 8시 개인 면담

 

 


잘 하고 있는 건지 모르겠다.

조원 분들은 다 앞서가고 계시고 나만 뒤쳐져 있는 느낌이다.

좀 더 자세히 공부하며 기본적인 원리를 이해하고 코드를 짜보고 싶은데

팀을 쫓아가자니 잘 모르는 것 그대로 따라하기도 그렇고, 그렇다고 마냥 뒤쳐져 있을 수도 없고..

이도 저도 아니게 된 것 같다.

어떻게 해야할까..