[EXPERIMENT] FEW SHOT 학습과 고민 노트 2
기존 학습방식과 비교해볼 때, few-shot 은 어떤 메리트가 있는지, 오버피팅의 문제를 과연 잘 해결하는지.. 라는 생각에 도달하면서 여러번의 학습을 시도해보았다. 다양한 데이터셋으로 여러 학습과 인퍼런스를 진행해 보았는데, 정리하자면 다음과 같다. 코드를 보고싶다면 github에 잘 정리해두었다.
먼저,
😀 basic emotion train, compound emotion val -> test with AFEW(basic emotion)
이번 실험은 처음으로 RAF-DB 데이터를 사용해보았다.
RAF-DB 데이터는 기본 감정 6가지(무표정+1) 총 7가지와 복합감정 11가지를 갖고 있다. 아래 이미지에는 복합감정이 12개인데 데이터셋에는 11개의 레이블만이 존재한다.. 왜인지는 모름
데이터셋 안에는 감사하게도 이미 align 된 이미지도 존재하기 때문에, 그 얼굴로 사용하였다.
이 실험에서는 unseen 데이터에 대해서 과연 잘 분류를 할지 여부를 파악하기 위해 진행하였다. 복합 감정이미지와 기본 이미지 모두 train/test 의 여부가 파일 이름으로 존재하는데, 일단 이번 실험에서는 기본감정의 모든 데이터를 (총15339개) train에, 복합감정의 모든 데이터(총 3954개)를 validation 으로 사용하였다.
조건
- epoch 500
- evaluation_episodes = 100 # Number of n-shot classification tasks to evaluate the model with
- episodes_per_epoch = 100 # epoch 당 들어갈 episode 개수
- drop_lr_every = 40
결과
Train | Eval |
---|---|
3way-5shot 5query | 4way-5shot 1query |
ACC | Loss |
---|---|
0.87 | 0.3093 |
eval 해야하는 데이터가 3954개 밖에 없어서 90%는 넘게 찍을 줄 알았는데 생각보다 작게 나왔다.
위에서 학습된 모델로 AFEW 데이터를 test 해보았다.
AFEW 데이터의 validation 데이터셋을 사용하였다. 모델 인퍼런스 구조가 같아야 하므로 test 또한 4way-5shot 1query 로 진행이 된다.
Test accuracy |
---|
37% |
4개 중에 하나 맞추는건데.. 이리도 못맞추다니.. 실망스럽다.
😀 다음 실험은,
7개의 레이블에 대해서 분류하는 모델들과 비교해야하므로 7way 로 진행하였다.
Train | Eval |
---|---|
3way-5shot 5query | 7way-1shot 1query |
ACC | Loss |
---|---|
0.89 | 0.27 |
Test accuracy |
---|
16% |
😀 AFEW 로 학습 -> compound emotion 테스트 하는 실험
AFEW 데이터의 가능성을 보기위해 다양하게 실험해보고 있다.
조건
- 일단 먼저 AFEW 학습은 모든 데이터로 하였다 (절반만 사용한 버전 아님)
- epoch 500
- evaluation_episodes = 100 # Number of n-shot classification tasks to evaluate the model with
- episodes_per_epoch = 100 # epoch 당 들어갈 episode 개수
- drop_lr_every = 40
Train | Eval |
---|---|
3way-5shot 5query | 4way-5shot 1query |
ACC | Loss |
---|---|
0.95 | 0.12 |
Test accuracy |
---|
33% |
😀 두 데이터를 섞은 train dataset! 만들어서 학습하기! 1
기존 RAF-DB 의 basic emotion 데이터에다가 AFEW의 데이터를 조금 추가해서 학습해본다(과연 AFEW의 적은 데이터로도 결과가 괜찮을지?)
- Angry (004108160, 002338014, 002613894) => 총 140개
- Disgust (002138680, 005923627, 00323664442) => 총 146개
- Happy (000231280, 001335200) => 총 148개
- Fear (002828240, 011613697, 01306270, 013949200) => 총 159개
- Neutral (005533800, 000909960, 002144977) => 총 135개
- Sad (002302057, 002643280, 005206720) => 총 139개
- Surprise (005913697, 002730440, 000252168, 013437680) => 총 153개 ==> 1020장
따라서 총 16359 이미지를 학습데이터로 사용한다
images background 에서 사용된 카테고리별 이미지 파일 갯수 |Angry |Sad|Happy|Disgust|Neutral|Fear|Surprise| |——|—|—|—|—|—|—| |1007|2599|6105|1023|3339|514|1772|
- evaluation 데이터는 AFEW의 VALID 이미지로 사용하였다. (총 18990장)
Train | Eval |
---|---|
3way-5shot 5query | 4way-5shot 1query |
ACC | Loss |
---|---|
0.95 | 0.12 |
또한, imageNet으로 pretrained 된 Resnet50 으로 같은 데이터를 학습한 결과 val acc가 개선되지 않아 일단, epoch 71 에서 멈추었다.
ACC | Loss |
---|---|
0.18 | 2.24 |
일반 cnn 모델인 resnet과 비교하기 위해서 evaluation의 support set에 들어가는 이미지를 train에서 가져오고자 한다. 각 train이미지에서 임의로 50개씩을 evaluation의 support 데이터로 들어가게 하여 query 데이터를 전부 evaluate 할 수 있게 해보았다.
images background 에서 사용된 카테고리별 이미지 파일 갯수
Angry | Sad | Happy | Disgust | Neutral | Fear | Surprise |
---|---|---|---|---|---|---|
957 | 2549 | 6055 | 973 | 3289 | 464 | 1722 |
😀 두 데이터를 섞은 train dataset! 만들어서 학습하기! 2
위의 실험의 경우 각 학습된 이미지들이 고르지 않아, 모든 카테고리마다 약 3000개씩 되도록 맞추어준 후 실험을 해 보았다.
그 외 잡다한 생각 끄적끄적
- 학습에 AFEW 섞어서 학습하기
- 이미지 하나씩 인퍼런스하는 방법 찾기..!
- AFEW는 비디오니까.. frame 처리된 애들 inference 해서 가장 많이 나온 감정으로 정답으로 계산하는건..? 이제껏 프레임 처리된 애들 개별로 계산했는데..
댓글남기기