2020년 4월 30일 목요일

Cylab diary 09 - 다양한 예제들을 돌려보자!_CNN 편 4

저번 포스팅에 이어지는 글입니다! 저번에 Resnet으로 CIFAR100 데이터를 돌려봐도 성공률이 높게 나오지 않았었습니다. 으음 이유가 뭘까 하고 살펴보던 중이었는데, 우선 두 가지 문제점을 발견했습니다. 첫 번째는, 우려했던 대로 모델을 잘못 카피한 것 같아요. 저번 포스팅에서 살펴봤던 대로 제가 카피했던 모델의 param은 총 490만개? 정도였는데 링크를 통해 살펴보니 param이 11.2m이라고 합니다. 제가 만든 모델의 2배 정도네요. 어디서 잘못된 건지 천천히 살펴봐야 할 것 같아요. 두 번째는, 모델을 트레이닝하는 과정이 링크에서와 많이 달랐습니다. 저는 코랩에서 15번째까지 돌려보고 딱히 accuracy가 오르지 않길래 여기까진가...하고 생각했는데 링크에서 살펴보니 lr을 5분의 1로 낮춰가며 계속 트레이닝을 해주었더라고요. 저는 0.001이 기본값인데에는 이유가 있다고 생각해서 그냥 그 값으로 계속 트레이닝해줘도 상관 없는줄 알았는데 그렇지 않은가봐요..(항상 수업에서만 돌려보고 실전을 안해본 티가 나는 것 같아요 ㅋㅋ...ㅠㅠ) 역시 딥러닝에서 가장 먼저 만져봐야 할 것이 lr이라는 말이 틀린 게 아닌 것 같습니다. 아무튼! 두 가지 문제점들을 차례로 고쳐보면서 정확도가 올라가는지 체크해보겠습니다.

1. 모델의 카피 과정에서의 실수 - 이건 둘 중에 하나입니다. 제가 모델을 잘못 이해했거나, 코딩 과정에서 카피를 잘못 떴거나. 모델을 잘못 이해했는지를 확인해보기 위해서 파라미터 수를 직접 계산해보려고 합니다...ㅋㅋ 흐음... 대충 BN과 Relu를 빼고 계산해보니 거의 맞게 나옵니다. 손으로 직접 계산해봐도 conv와 FC를 모두 합쳐서 4773504 라는 값이 나옵니다. 이러면 아마도 코딩은 맞게 했을 것이고, 제가 모델을 잘못 이해한 거라는 결론이 나오네요. 으으음 그래도 코딩 잘못한것보단 이게 덜 귀찮네요ㅋㅋ.. 다시 링크로 돌아가서 모델을 이해해보도록 합시다!! ~~~라고는 했지만 다시 살펴봐도 제가 맞게 이해한 것 같아요.. 으으 그래도 링크에서 올린 값이 틀릴것 같지는 않은데... 우선 위에서 찾은 두 번째 문제점을 다시 적용해보고 accuracy가 올라가는지 확인해보고 옵시다!

2. 링크를 보면 0.1에서 0.0008까지 점진적으로 0.2를 곱해가면서 에폭을 돌려주고 있네요. keras adamoptimizer의 lr기본값이 0.001로 설정되어있는데, 처음엔 뭔가 이 영향이 클 거라고 생각했는데 링크에서 사용한 최종 lr값인 0.0008과는 거의 차이가 안나네요. 우선 0.001로 돌려보고 accuracy가 잘 안올라가는 수준에서 0.0005로 돌아가게 바꾸어놓았는데 이렇게 하면 결과가 잘 나오는지 확인을 해봐야 할 것 같아요. 이렇게 해보고 잘 안나오면 링크에서처럼 높은 lr부터 점진적으로 내려오는 방법을 써보고, 그래도 안되면 이쪽에 원인이 있던게 아니었겠죠. 높은 lr부터 점진적으로 내려와야 하는 방법이 트레이닝이 잘 된다면, 좀 global하게 loss가 낮은 곳을 탐색하고, 그로부터 천천히 내려오는게 loss를 줄일 수 있던 방법이었던거고, 만약 0.001로 돌리고 0.0005로 했는데도 잘 나오면 단순히 조금 더 미세한 gradient 조정을 통해 loss를 급격히 낮출 수 있도록 loss가 분포되어 있었던 거겠죠.

코랩에서 돌리면 오래 걸려서 결과 확인이 힘들어요. 게다가 12시간이 지나면 세션이 만료되어 버려서(코랩 프로버전이 아니라서요..) 더 돌릴 수가 없게 됩니다. 아마 에폭 15정도까지는 기록이 될 텐데, 좀 더 돌려봐야한다는 필요성이 느껴지면 gradient를 저장하고 이어서 트레이닝하는 방법을 사용해야 할 것 같아요. 우선은 아직 결과를 확인하지는 못했으니 기다릴 뿐입니다. 나중에 전역하면 컴퓨터를 좀 좋은 걸로 맞추고 싶어요..ㅋㅋㅋ큐ㅠㅠ
코랩도 좋기는 하지만 너무 느려서 답답해요... 워크스테이션이라도 맞춰야 하나...

으으 이게 그냥 돌려놓고 딴데 가버리면 모니터 화면이 꺼지고 세션이 종료되는 것 같아요. 1에폭 돌릴 때마다 저장을 해도 저장 한번 하고 세션이 멈춰버리네요...ㄷ 흑 한참 열의에 가득차있었는데 답답하네요ㅠ 그러면 코드 돌리는 동안 다른 거 할 거를 찾아봐야할 것 같습니다. 일단 패스! 그래도 계속 꾸준히 돌려주기는 할게요.

- 업데이트 (0502)
오옹??? lr을 0.0005로 낮춰놓고 에폭을 돌렸더니 accuracy가 확 올라갔습니다. 역시 lr문제였던 걸까요..? 아직 다 돌리지 못해서 1에폭만 돌린 상황인데도 accuracy가 38.7이나 나오네요...! 어디까지 올라가나 확인을 해보면 더 좋을 것 같아요. 기대됩니다ㅎㅎ
....으엑 1에폭 뒤로는 계속 떨어지네요ㅠ 다시다시

-  업데이트(0503)
깃헙에 있는 torch로 쓰인 파일을 긁어와서 모델을 어디서 잘못 만든건지 다시 알아보고 있습니다.... 이제부터는 다음 포스팅으로 넘길게요!

댓글 없음:

댓글 쓰기