공부하며 성장하기/인공지능 AI
![Yolov5에서 ModelEMA와 model fuse가 의미하는 것](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuHxYc%2FbtrMXG0SmQU%2FkWiw18gTx5VtMp8K0KyZDK%2Fimg.jpg)
Yolov5에서 ModelEMA와 model fuse가 의미하는 것
Fuse란? Yolov5는 대표적인 객체 탐지(Object detection) 모델 중 하나이다. 탐지(추론)를 위해 모델을 불러올 때, 그 코드를 살펴보면 attempt_load라는 함수를 이용한다. * detect.py > DetectMultiBackend() > attempt_load()에서 찾을 수 있다. 그런데 이 함수를 잘 살펴보면 ckpt.get('ema'), 즉 모델의 'ema'라는 속성을 가져온다거나, ckpt.fuse().eval() if fuse와 같이 불러온 모델을 fuse하도록 하는 것을 알 수 있다. # yolov5/model/experimental.py def attempt_load(weights, device=None, inplace=True, fuse=True): from ..
![YOLOv3 모델 학습 속도 개선하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBD3dL%2FbtrE6xK0ipH%2Fz8DYMx1WjkNtaSmCKP6Qpk%2Fimg.png)
YOLOv3 모델 학습 속도 개선하기
최근 여러 YOLO 모델로 데이터를 학습시키는 과정에서 시간이 오래 걸려 고생했습니다. 데이터가 많아서라기 보다는 GPU 사용률(Utilization)이 평균 20%에도 미치지 못한 것이 가장 큰 원인이었어요. 하지만 여러 시도 끝에 결국은 사용률을 90% 이상으로 개선했고, 학습 시간을 3분의 1로 줄일 수 있었습니다. 우선 제가 최종적으로 사용한 것은 아래 모델입니다. YOLO 모델로는 Ultralytics에서 배포한 repository들을 많이 이용하실텐데, 제 경우에는 프로젝트에 맞게 수정하기가 까다로운 구조라고 판단해서 대신 아래 repository를 가져와서 사용했습니다. GitHub - eriklindernoren/PyTorch-YOLOv3: Minimal PyTorch implementat..
![서포트 벡터 머신(Support Vector Machine)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1CgIP%2FbtrtRXnZCkn%2FLnlq9CL0BIjH7xQySYqKN0%2Fimg.png)
서포트 벡터 머신(Support Vector Machine)
서포트 벡터 머신(이하 SVM)은 최대 마진 분류기(Maximal margin classifier)를 일반화한 모델입니다. 최대 마진 분류기는 매우 단순하면서도 강력하지만, 대부분의 데이터셋이 선형 결정 경계(Decision boundary)로 구별되기 어렵기 때문에 이를 더 확장한 모델들을 만들어냈습니다. 이번 글에서는 이들이 어떻게 다르고, 또 구체적으로 어떻게 동작하는지 정리해보았습니다. 최대 마진 분류기 앞서 언급한 모든 분류기가 하는 일은 바로 최적의 분리 초평면(Hyperplane)을 찾는 것입니다. 여기서 초평면이란 p차원의 공간에서 p-1차원인 평평한 아핀(affine) 부분 공간을 말합니다. 예를 들어 3차원 공간에서 평평한 2차원의 초평면을 수식으로 나타내면 다음과 같습니다. (이때 `..
![딥러닝 오차 역전파(Back-propagation) 정확히 이해하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS0O4e%2Fbtrtb0S6hl3%2F2RAjzvFvX5KVAxahYY9vGk%2Fimg.png)
딥러닝 오차 역전파(Back-propagation) 정확히 이해하기
이번 글에서는 뉴럴 네트워크(또는 신경망, Neural Network)에서 가중치(Weights)를 최적화(Optimization) 하기 위해 사용하는 오차 역전파(Back-propagation)의 과정을 직접 계산하면서 이해해보도록 하겠습니다. 예를 들어 아래 그림과 같은 신경망이 있습니다. 파란색은 input 또는 output 값을, 빨간색은 초기 가중치의 값을 나타냅니다. ① Feed forward 오차역전파를 위해서는 우선 순방향으로 결과 값을 먼저 계산한 후에 그 오차(Error)를 구해야 합니다. 하나씩 순서대로 계산해보겠습니다. $$net_{h_1} = i_1 * w_1 + i_2 * w_2 + b_1 * 1 = 0.05 * 0.15 + 0.1 * 0.2 + 0.35 * 1 = 0.3775$..
![[한 줄 정리] 베이지안 최적화(Bayesian Optimization)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzeETL%2Fbtrs71ydzXU%2FY620PTHb11Ld9VIhMBmKP1%2Fimg.png)
[한 줄 정리] 베이지안 최적화(Bayesian Optimization)
하이퍼파라미터를 최적화하기 위한 방법 중 하나로, 베이지안 정리를 기반으로 합니다. 베이지안 최적화는 미지의 목적함수를 학습함으로써 이를 전역 최적해로 만드는 파라미터를 찾는 방법입니다. 이를 위해 먼저 사전분포에 기반해 하나의 탐색 함수를 가정합니다. 그리고 매번 새로운 샘플링을 사용해 목적함수를 테스트할 때 해당 정보를 사용해 새로운 목적함수의 사전분포를 업데이트합니다. 마지막으로 사후 분포를 통해 얻은 전역 최적해가 나타날 가능성이 가장 높은 위치에서 알고리즘을 테스트합니다. 그리드 탐색(Grid Search), 랜덤 탐색(Random Search) 같은 다른 기법들과 가장 중요한 차이는 바로 이전까지 탐색한 하이퍼파라미터 값들의 성능 결과 값을 사전 지식으로 활용한다는 점입니다. 또한 20개 이하..
![CNN Parameter Sharing](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEG4VW%2FbtrsWLovDhm%2FeRy7p2CdAR9EleZcXe4pnK%2Fimg.png)
CNN Parameter Sharing
딥러닝을 처음 공부할 때 CNN(Convolutional Neural Network, 합성곱 신경망)에 대해 배웁니다. 일반 신경망 Neural Net과 유사하지만 이미지 데이터의 특성을 인코딩할 수 있고, 또 그 과정에서 네트워크를 학습시키는데 필요한 가중치, 즉 parameter의 수를 크게 줄일 수 있다는 장점이 있습니다. 그런데 CNN은 어떻게 해서 parameter 수를 줄이는 걸까요? Conv layer(합성곱 층)과 Pooling layer에서 파라미터가 줄어든다는 것은 쉽게 예상해볼 수 있지만, 그 과정을 정확히 설명하기 위해서는 바로 parameter sharing의 개념을 이해해야 합니다. 때문에 이번 글에서는 CNN의 parameter sharing 또는 weights replicat..
![모델 검증 방법](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFD6r2%2FbtrsFsIpZ3g%2FXehna7NILnl1Z7EqIn9knK%2Fimg.jpg)
모델 검증 방법
이번 글에서는 모델의 검증(Validation) 방법을 간단히 정리해 보았습니다. 모델 검증 방법은 크게 3가지로 나뉩니다. ① 홀드아웃(Hold-out) 가장 간단하고 직접적인 검증 방법으로, 데이터를 임의로 나눠 각각 훈련, 검증, 테스트에 사용합니다. 일반적으로 각 크기를 6:2:2 비율로 나누거나, 훈련과 테스트 데이터셋을 7:3 또는 8:2 비율로 나눈 후, 훈련 데이터셋을 다시 훈련과 검증 셋으로 7:3 또는 8:2 비율로 나눠 사용하기도 합니다. 단점은 데이터셋을 어떻게 나누느냐에 따라 테스트 성능에 차이가 크다는 것입니다. 이는 곧 검증을 한 번만 수행하기 때문이기도 하죠. 따라서 이를 보완하기 위해 다음과 같은 교차 검증 방법이 등장하게 되었습니다. ② 교차 검증(Cross Validat..
![ROC 곡선 vs. P-R 곡선](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQwrlw%2Fbtrr15VRO40%2FrPA6ZkAjDxHSu6jMR8LApK%2Fimg.gif)
ROC 곡선 vs. P-R 곡선
지난 글에서 분류 모델의 평가 지표와 ROC 곡선(Receiver Operating Characteristic Curve)에 대해 정리해 보았습니다. 이번 글에서는 P-R 곡선(Precision-Recall Curve)에 대해 알아보고, 각 곡선을 언제 이용하는 게 좋은지 비교하며 살펴보겠습니다. 이전 글은 아래 북마크를 통해 확인하실 수 있습니다. [한 줄 정리] 분류 모델 평가 지표 혼동 행렬 Confusion Matrix - 실제 및 모델이 예측한 데이터의 분류를 나타냅니다. - 예를 들어 이메일의 스팸 여부를 분류하는 문제가 있을 때, TP(True Positive)는 실제 스팸인 이메일을 분류기가 스팸 nanunzoey.tistory.com P-R 곡선이란? P-R 곡선은 정밀도 precisio..
![[한 줄 정리] 분류 모델 평가 지표](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiwArF%2FbtrrqY3u6RR%2F4nlp6JAj6XLduGEVH5rKjK%2Fimg.png)
[한 줄 정리] 분류 모델 평가 지표
혼동 행렬 Confusion Matrix - 실제 및 모델이 예측한 데이터의 분류를 나타냅니다. - 예를 들어 이메일의 스팸 여부를 분류하는 문제가 있을 때, TP(True Positive)는 실제 스팸인 이메일을 분류기가 스팸이라고 제대로 분류한 경우입니다. - 반대로 FP(False Positive)는 실제 스팸이 아닌 이메일을 분류기가 스팸이라고 잘못 분류한 경우입니다. 정밀도 Precision - 분류기가 양성 샘플이라고 분류한 것 중에서 실제 양성 샘플의 비율, 즉 분류기가 스팸으로 분류한 것 중 실제 스팸인 비율입니다. $$Precision = \frac{45}{45+5} = 0.9$$ 재현율 Recall / 민감도 Sensitivity - True positive rate, 실제 양성인 샘플..
![[한 줄 정리] SMOTE](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKWUn7%2FbtrqNefNsqr%2FsRKk08JT1ymG1yxuMB6vSK%2Fimg.png)
[한 줄 정리] SMOTE
SMOTE(Synthetic Minority Oversampling Technique)란 데이터가 부족할 때, 특히 분류 문제에서 클래스 간 불균형을 해결하기 위해 사용하는 대표적인 오버 샘플링 기법입니다. 아래 그림처럼 '+' 클래스의 데이터를 SMOTE 해보겠습니다. ① 큰 빨간 원으로 표시한 데이터로부터 k개의 NN(Nearest Neighbors) 중 랜덤 샘플 하나(작은 빨간 원으로 표시)를 선택합니다. ② 선택한 샘플 `\hat{x_i}`와 기존 샘플 `x_i`을 연결한 직선 위의 새로운 랜덤 샘플(파란색)을 생성합니다. 위 내용을 새로 생성한 샘플에 대한 수식으로 표현하면 다음과 같습니다. $$Synthetic(New)\: Sample = x_i + u\: \cdot \: (\hat{x_i}..