잘못되었거나 확실하지않은 내용이 있다면 알려주시면 정말 감사하겠습니다
목표
facenet의 핵심 모델구조를 구현해보자
유명한 임베딩모델과 임베딩 모델의 활용법
유명한 임베딩 모델로는 FaceNet이 있다
160*160크기의 컬러 얼굴 이미지를 입력으로 받아 128차원의 임베딩 백터를 출력한다
128 차원 벡터는 입력 이미지의 얼굴 특성을 충분히 담고있다
그러므로 유사한 두사진은 백터공간속에서 가깝게 위치하고있다
이런점을 이용하여 좌표간 유사도를 구하는 방식으로 이미지의 유사도를 측정할수있다
Triplet Loss를 이용한 Metric Learning
Metric Learning은 객체 간의 유사성이나 거리를 고려하여 임베딩을 학습하는 방식이며
Triplet Loss는 Metric Learning의 한 종류이다
앵커, 긍정, 부정 샘플의 관계를 이용하여 임베딩을 학습한다
비슷한 데이터는 임베딩 공간에서 가까이 위치하고, 서로 다른 데이터는 멀리 위치하도록 학습하는것이 목표이다
triplet loss 수식은 다음과 같다
L = max(0, D(A, P) - D(A, N) + margin)
좌표간 유사도 측정방식은 주로 유클리디언 거리를 사용한다고 한다
여기서,
- L은 손실 값
- A는 앵커(anchor) 샘플
- P는 긍정적(positive) 샘플
- N은 부정적(negative) 샘플
- D(x, y)는 두 임베딩 x와 y 사이의 거리 (일반적으로 유클리디안 거리)
- margin은 손실 함수의 마진 값으로, 긍정적 샘플과 부정적 샘플 사이의 거리를 얼마나 멀게 유지할 것인지를 결정하는 하이퍼파라미터이다, margin을 설정함으로서 긍정적 샘플과 부정적 샘플사이의 거리가 margin 이상이되는것을 목표로 학습을 진행할수있다 그렇다고 무조건 margin이 클수록 좋은것은아니다 너무 margin이 크면
모델이 일반화하는데 어려움을 겪을수있다
facenet에서는 하이퍼파라미터 margin의 값으로 0.2를 사용한다고 한다
semi hard triplet
triplet학습에 쓰일 데이터를 정하는 방식중하나이다
배치데이터를 가지고
모든 triplet 조합을 학습하는데 쓰는것이 아닌 다음과 같은 조건을 만족하는 triplet 데이터 조합만 사용한다
쉽게 말해 어느정도의 난이도 있는문제만 학습에 이용한다는것이다
1. anchor - positive 거리보다 anchor - negative 거리가 큰 경우
2. anchor - positive 거리와 anchor-negative 거리의 차이가 margin보다 작아야함
일반적으로 데이터를 구성할때 그리고 triplet loss를 구할때 동일한 margin값을 사용한다고함
L2 정규화의 사용
먼저 배치로 들어온 128차원의 임베딩 백터에 L2정규화를 진행한다
128차원속 좌표와 원점과의 거리가 1이되도록 맞추는것이다
embeddings = model(inputs)
embeddings = F.normalize(embeddings, p=2, dim=1) # L2 정규화 적용
이를통해
1. 크기에 무관한비교: 정규화된 임베딩은 크기가 1로 일정하기때문에 임베딩간의 유클리디언거리 측정에서 거리의 범위를 어느정도 제한할수있고 학습에 있어서 방향성이 중요해진다
2. 학습속도 향상: 정규화된 임베딩은 학습과정에서 최적화 알고리즘이 더 빠르게 수렴할수 있도록 돕는다
facenet의 핵심 모델구조의 구현
전체 코드는 깃허브에 있습니다 => 링크
CIFAR-10 데이터셋속 비행기와 자동차 데이터를 대상으로 임베딩 모델을 만들어봤다
facenet 모델 논문에서 핵심적인 부분이라고 생각되는 semi hard triplet과 L2정규화를 적용하였다
resnet18을 파인튜닝시키는 방식으로 학습을 진행했다
소요시간은 1에폭당 30분정도로 오래걸리는 편이다 따라서 10에폭정도만 돌려봤다
학습그래프가를 통해 정상적으로 학습되었음을 알수있다
성능테스트는 자동차 대표 이미지와 비행기 대표 이미지를 각각 설정한뒤
test이미지와의 거리를 측정해 더 가까운쪽으로 예측했다
만약 test-비행기 거리가 1.18, test-자동차 거리가 1.16이라면
test를 자동차로 예측하게되는 방식이다
이방법이 일반적인 임베딩 모델의 성능을 측정할때 쓰이는지는 모르겠으나 난 이렇게 했다
정확도는 96.8%가 나왔다
대표이미지는 다음과 같다
'기타' 카테고리의 다른 글
코랩 셀 실행 끝날때 소리로 알림받는방법 (0) | 2023.09.15 |
---|---|
okt형태소분석기 사전 업데이트 (0) | 2023.04.28 |
FL STUDIO 첫번째 곡(기초조작법 익히기) (0) | 2023.04.16 |
넘파이에서 리스트처럼 곱하기 적용하고싶을때 (0) | 2023.02.25 |
re.search 위치 여러개 찾기 (0) | 2023.02.23 |
댓글