본문 바로가기
BOOSTCAMP AI TECH/PStage

01. Computer Vision

by 이민우 2021. 4. 24.
728x90
반응형

EDA (Exploratory Data Analysis, 탐색적 데이터 분석)

-데이터를 이해하기 위한 노력이다.

-데이터의 분포 및 값을 검토함으로써 데이터의 표현을 잘 이해하고, 잠재적인 문제를 발견한다.

-모델링에 앞서 선행되는 과정으로, 데이터의 분포나 변수간 관계를 파악하기 위해

 히스토드램, 산점도, 상관관계표 등을 활용해 시각화 하는 방법이다.

-파악해야 할 주요 정보는 다음과 같다.

 1) 수치형인데 명목형인 변수

 2) 명목형인데 순서가 중요한 변수 (ex : Excellent, Good, Average ... )

 3) 합쳐서 하나로 만들 수 있는 변수들

 4) 쪼개서 나눌 수 있는 변수

 5) 결측값인지 0인지 헷갈리는 관측치

 

 

 

 

Data Pre-processing (데이터 전처리)

-학습을 진행하기 전에 학습의 대상이 될 데이터를 분류하고 선별하는 작업

-대부분 경진대회용 데이터는 품질이 양호하지만 현실 데이터를 그렇지 못하다.

-전처리를 통해 좋은 데이터를 만드는 것이 모델의 성능 개선에 큰 도움이 된다.

 

 

 

 

Data Augmentation (데이터 증강)

-실제 데이터는 하나의 형식으로만 존재하는 것이 아니라, 상황과 환경에 따라 노이즈가 섞여 다양한 데이터로 변한다.

 ex) 비가 올 때, 밝을 때, 어두울 때 등

-이러한 노이즈에 대비하여 이러한 노이즈에도 제대로 된 예측을 할 수 있도록 다양한 형태의 데이터로 증강이

 필요하다.

-이러한 작업을 데이터 증강이라고 한다.

-증강 기법을 다양하게 적용하는 것이 능사는 아니다. 모든 증강 기법이 항상 좋은 결과를 가져다 주지는 않기 때문.

-그렇기에 정의한 주제를 깊이 관찰하여 어떤 기법을 적용해야 할지를 결정해야 한다.

-오픈소스 이미지 증강 : github.com/albumentations-team/albumentations

 

 

 

 

Data Feeding

-먹이를 준다는 것은 마냥 주는 것이 아니라 대상의 상태를 고려하여 적정량을 주는 것이다.

-생산 공정에서도 마냥 많이 제작한다고 좋은 것이 아닌 것과 마찬가지의 의미이다.

 생산을 많이해도 포장과 운송 속도가 고정되면 나쁘기 때문.

-이는 모델을 학습할 때도 마찬가지이다. Data Generator가 10 batch를 넘겨주는데, Model이 20 batch를

 학습할 수 있다면 당연히 학습 속도가 느려진다. (초당 10 batch)

-그렇기에 모델과 GPU의 상태에 따라 적절한 Batch Size를 주는 것이 중요하다.

-물론 Batch Size뿐 아니라 연산량도 계산해야 하기에 Image Shape 등도 조절해야 한다.

 

 

 

 

torch.utils.data

-Datasets : 데이터를 데이터셋으로 변환해준다. __init__, __getitem__, __len__을 정의해줘야 한다.

-DataLoader : Dataset을 효율적으로 사용할 수 있도록 배치 사이즈 등의 파라미터를 추가한다.

-파라미터 중 num_workers는 코어(쓰레드)와 같다. 증가할 수록 속도가 빠르기는 하지만, 하드웨어의 성능을

 넘어설 정도의 workers를 설정하면 오히려 효율이 떨어질 수도 있다.

 

 

 

 

Design Model With PyTorch

-파이토치는 케라스와 비교하면 많이 불편하다. 모든 것이 함수로 정의된 케라스와 달리 파이토치는

 모든 것을 수작업으로 설정해줘야 한다.

-하지만 이러한 점은 다양한 파라미터를 개발자가 직접 설계할 수 있기 때문에 연구에서는 자주 사용된다.

 

 

 

 

nn.Module

-파이토치 모델의 모든 레이어는 nn.Module 클래스를 따른다.

-modules : Module 내에서 정의한 각 레이어들. 모든 nn.Module은 child modules를 가진다.

-forward() : 모델이 호출되었을 때 실행되는 함수. 모든 nn.Module을 상속받은 클래스들은 forward를 가진다.

-parameters : 모델에 정의된 modules가 가지고 있는, 계산에 사용될 파라미터. 

-model.state_dict(), model.parameters()로 확인이 가능하다.

-각 모델 파라미터들은 data, grad, requires_grad 변수 등을 가지고 있다.

 

 

 

 

 

Pretrained Model

-사실 모델 일반화를 위해 매번 수많은 이미지를 학습시키는 것은 까다롭고 비효율적이다.

-Pretrained Model들은 좋은 품질의 대용량 데이터로 사전 학습이 되어있다. 그리고 이로 인해 Weight를

 보유하고 있다.

-그렇기에 이 모델을 바탕으로 내 목적에 맞게 다듬어 사용하면, 시간적으로 매우 효율적이다.

-torchvision.models의 모델들을 활용하면 쉽게 Pretrained Weight을 다운받을 수 있다.

 

 

 

 

 

Transfer Learning

-CNN 계열 사전 학습 모델들은 대부분 1,000개의 output을 출력하는 classifier로 끝난다.

-그래서 이러한 모델을 사전 학습 모델가 해결하고자 한 문제와 내가 해결하고자 하는 문제와의

 유사성을 고려하여 변경해야 한다.

-대부분의 CNN 모델은 CNN-DNN으로 이루어져 있다.

-만약 학습할 데이터가 충분하다면 CNN과 DNN 모두 재학습이 가능하다.

-하지만 그렇지 않다면 DNN 정도만 변경하여 학습하는 것이 좋다.

 

 

 

 

*모델의 학습 프로세스에 필요한 요소는 크게 Loss, Optimizer, Metric이 있다.

 

Loss

-Cost함수, Error함수(오차함수)라고도 한다.

-모델이 출력한 예측값과 실제값과의 차이를 계산한 함수이다.

-이 Loss값을 토대로 역전파를 수행하여 모델의 파라미터들을 변경한다.

-loss.backward()를 활용해 모델의 파라미터의 grad 값을 업데이트 한다.

-물론 required_grad = True 인 grad는 변경하지 않는다.

-Focal Loss

 *Class Imbalance 문제에서 맞춘 확률이 높은 class는 낮은 loss를, 맞춘 확률이 낮은 class는 높은 Loss를 부여한다.

-Label Smoothing Loss

 *Class를 원핫이 아닌 Soft하게 표현하여 일반화 성능 증가

 

 

 

 

 

Optimizer

-모델의 weight 파라미터를 변경한다.

-LR Scheduler : LearningRate(학습률)을 학습 중에 동적으로 변경한다.

-torch.optim.lr_scheduler.StepLR : 특정 스텝마다 LR을 변경한다. (if step_size == 2 : 2 스텝마다 LR 변경)

-torch.optim.lr_scheduler.CosineAnnealingLR : 코사인 형태에 따라 LR 변경

*코사인 그래프에 따라 변경하기에 변화의 폭이 크고, 이 덕분에 Local Minima에 빠지지 않게 해준다.

-torch.optim.lr_scheduler.ReduceLROnPlateau : 더 이상 성능 향사잉 없을 때 LR 감소

 

 

 

 

 

Metric

-모델의 성능을 평가하는 기법

-Classification의 경우 Accuracy, F1-Score, Precision, Recall 등 사용

-Regression은 MAE, MSE 사용

-Ranking은 MPR, NDCG, MAP 사용

-학습에 직접적으로 사용되는 것은 아니지만 학습된 모델을 객관적으로 평가할 수 있는 지표이다.

-Accuracy를 너무 믿지 말고, 데이터의 상태에 따라 적절한 Metric을 선택하는 것이 필요하다.

-Class의 분포가 적당하면 Accuracy가 좋고, Class의 분포가 좋지 않으면 F1-Score를 사용하는 것이 좋다.

 

 

 

 

 

Training Process

-model.train() : 모델을 학습 상태로 만든다. Dropout이 활성화되고, BatchNormalization의 변화 등을 설정한다.

-optimizer.zero_grad() : 이전 배치에서 얻은 기울기를 0으로 초기화한다.

 2번째 학습부터 optimizer는 이전 배치에서의 grad를 가지고 있기 때문에

 이를 초기화해야 새로운 가중치 현향에 대한 새로운 기울기를 구할 수 있다.

 그렇기 때문에 loss를 backward 시키기 전에 수행해줘야 한다.

-물론 이는 일반적인 방법론일 뿐, 수행하지 않아도 되기는 한다.

-loss = criterion(outputs, labels) : loss값 계산

-loss.backward() : 가중치 W와 편향 b에 대한 기울기 계산

-optimizer.step() : W와 b에서 리턴되는 변수들의 기울기에 학습률을 곱하여 빼줌으로써 업데이트.

 

 

 

 

 

Inference Process

-model.eval() : 모델을 검증 모드로 바꾼다.

-with torch.no_grad() : 파라미터를 업데이트 하지 않도록 모드 설정.

 

 

 

 

 

PyTorch Lightning

-PyTorch를 Keras처럼 쉽게 사용할 수 있도록 여러 함수를 제공.

 

 

 

 

 

Ensemble

-싱글 모델보다 더 나은 성능을 위해 서로 다른 여러 학습 모델을 사용하는 것.

-실험을 통해 얻어진 여러 모델들을 만든 결과를 합친다.

-Hard Voting은 One hot 인코딩을 기반으로 하고, Soft Vote는 Softmax를 기반으로 모델들을 앙상블한다.

-K-Fold : 데이터를 K개로 분할하여 1개를 검증으로, K-1개를 학습에 사용한다.

-그렇게 학습한 K개의 모델을 앙상블하여 사용한다.

-모델을 앙상블 하는 것이 아니라, 데이터를 주제로 앙상블 하는 방법도 존재한다.

-즉 하나의 데이터를 Augmentation시킨 후 하나의 모델에 각자 추론을 한 결과를 합칠 수도 있다.

-이를 TTA(Test Time Augmentation)이라고 한다.

-앙상블은 효과가 좋지만 그만큼 학습과 추론 시간이 소모된다.

 

 

 

 

 

Hyperparameter Optimization

-하이퍼 파라미터 : 시스템의 매커니즘에 영향을 주는 주요한 파라미터

-시간과 하드웨어가 충분하다면 여러 시도를 할 수 있다.

-이러한 작업은 optuna를 사용하면 쉽게 할 수 있다.

-optuna는 파라미터 범위를 주고 그 범위 안에서 trials 만큼 시행한다.

728x90
반응형

'BOOSTCAMP AI TECH > PStage' 카테고리의 다른 글

03-02. MRC (Machine Reading Comprehension, 기계독해)  (0) 2021.04.26
03-01. Object Detection / Segmentation  (0) 2021.04.26
02-02. Tabular  (0) 2021.04.24
02-01. KLUE  (0) 2021.04.24
00. 시각화  (0) 2021.04.24