공부한 내용
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
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시 개인 면담
잘 하고 있는 건지 모르겠다.
조원 분들은 다 앞서가고 계시고 나만 뒤쳐져 있는 느낌이다.
좀 더 자세히 공부하며 기본적인 원리를 이해하고 코드를 짜보고 싶은데
팀을 쫓아가자니 잘 모르는 것 그대로 따라하기도 그렇고, 그렇다고 마냥 뒤쳐져 있을 수도 없고..
이도 저도 아니게 된 것 같다.
어떻게 해야할까..
'BoostCamp' 카테고리의 다른 글
2021.08.27 - [Week 4] Day 5. 대회 1주차 마무리 (0) | 2021.08.27 |
---|---|
2021.08.26 - [Week 4] Day 4. 대회 진행 중 (3) (0) | 2021.08.27 |
2021.08.24 - [Week 4] Day 2. 대회 진행 중 (0) | 2021.08.25 |
2021.08.23 - [Week 4] Day 1. 대회 시작 (0) | 2021.08.23 |
2021.08.20 - [Week 3] Day 4. - (0) | 2021.08.21 |