Training에서의 loss, accuracy에서 accuracy만 높아지고 loss 변화 없어지면서 오버핏이 발생하고 있음을 알 수 있었습니다. Test set으로 Evaluate해보니까 test loss가 2자리 나오고 accuracy도 0.33대였습니다.
Predict 함수로 예측확률분포와 잘못 예측하고 있는 경우에 해당하는 데이터들을 살펴봤을때 모두 0(가위)으로 인식했습니다. Test set 경로 대신 Train set을 Test 돌려보고 혹시나.. 모델이 잘못된 것인지, 학습이 잘못 진행된 것은 아닌지 확인했습니다.
Idea
Dataset을 키울 필요가 있어보였습니다. 데이터셋 일부분들에서는 배경이 다르거나, 배경이 고정된 경우가 많기 때문에 이 점을 유의해서 랜덤하게 분포하도록 수정했습니다. Augmentation을 써도 되지만 이번 단계에서는 데이터 증강(Augmentation) 개념을 이용하는 것보단, 다른 방법을 원하는거 같아, Augmentation을 진행하지 않았습니다.
Linux에서 데이터셋을 00장씩에서 한번에 만장씩 올리기 보다 차츰 차츰 추가해보면서 데이터셋에 따른 훈련 결과의 변화를 살펴봤습니다.
평가 기준인 정확도 60% 이상에는 부합하지만, 가위바위보처럼 서로 객체간에 차이점이 뚜렷한 클래스인 경우 60점은 낮은 편이었습니다. MNIST를 생각해보면 흑백에, edge 요소만 있는 데이터셋을 모델에 훈련시켰을 때 거의 90점 이상이었습니다. 따라서 이와 비슷한(?) 각 클래스간에 색요소가 동일하면서 손가락이 2개, 0개, 5개로 edge 요소만 차이가 있는 가위바위보도 60점에 만족하면 안되는 데이터셋이라고 생각해 좀더 정확도를 높이는 시도를 진행했습니다.
이번 Trial에서 빠가 좀 특이한 클래스라는 점을 알았습니다. 하지만, 현재 Test set에는 허점이 있습니다. 랜덤 추출하지 않았다는 점입니다. Test set을 그냥 한 사람이 구축한 고정된 배경과 대상(특정 한 사람의 손)으로 했기 때문에 진짜 맞추기 어려웠던 정답이 아닐 수 있다는 생각이 들었습니다.
Solution
시험도 문제출제자가 여러 명이면 점수가 좀더 객관적일 수 있듯이 Dataset도 마찬가지입니다. 각 데이터 구축자가 만든 100개의 묵찌빠 데이터에서 각각 20개씩 빼서 Test 정확도를 신뢰할 수 있게 만들어 볼 예정입니다.
여기서 주의할 점은 데이터셋이 연속촬영으로 구축되었기 때문에 한 구축자가 만든 Dataset을 Train, Test set으로 나눠준다면 정확도가 신뢰성이 낮을 수 있습니다. 그러므로 Test set을 늘리는 것에 기존 3rd까지의 Train set에 있는 것에서는 Test에 포함시키지 않을 것 입니다. 이유는 훈련에서 중요한 점 중 하나가 바로 Train과 Test set은 겹치면 안 된다는 점 때문입니다. 그래서 보통은 한 구축된 데이터에서 랜덤하게 샘플링해서 Train, Test로 나눠주지만 이번 프로젝트에서 구축한 Set은 연속촬영 사진이라 서로 간에 너무 유사해서 Test set을 따로 두고 늘림으로써 진짜 정확도가 높아진 것인지 정확도가 '일반적'인지 확인해볼 것 입니다.
데이터셋을 하나씩 열어보면서 배경이 색깔이 있거나, 손을 각도를 준 데이터를 위주로 각 클래스별로 60장 정도 추가했더니 Test 결과가 나빠졌습니다. 앞에서 3rd했던 시도가 데이터를 조금씩 늘려가는 방향은 맞았지만 생각보다 신뢰도가 높지는 않다는 점을 알 수 있었습니다. 아마 3rd했던 거를 60점 넘겼다고 제출했으면.. 실제로는 60점이 아닐 수 있습니다.
불행 중 다행인 점은 잘못 예측한 값을 추출해서 봤을 때 각 라벨들을 틀리지만 이전 시도들처럼 특정 답(라벨)만 내놓는 경우는 없었습니다. 어느 정도 훈련데이터가 그래도 일반적인 정확도가 보장된 것은 아니지만 랜덤성은 나쁘지 않다고 생각됩니다.
Solution
시험지를 풀 때도 기출 문제 뿐만 아니라 예상 적중 모의고사 문제집으로 공부하는 이유는 어려운 문제를 맞추기 위해서다. 그 때 가장 기초적인 접근은 많이 풀기입니다. 모델이 더 많은 경우를 학습해볼 수 있도록 각 클래스를 모두 양을 늘려볼 예정입니다.
반복학습이 중요하듯이 데이터양이 많아지면 epoch을 좀더 늘려서 여러번 학습할 수 있도록 해야합니다. 한 3rd 시도 때부터 조금씩 10 epoch일때의 정확도가 좋지가 않았습니다다. train accuracy가 절대적이진 않지만 그래도 이전과 비교했을 때 상대적으로 떨어지기 때문에 이 부분은 epoch을 실험적으로 확인해서 10에서 15나 20정도로 늘려봐야겠습니다.