2020년 4월 26일 일요일

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

원래의 resnet모델을 찾아보면 imagenet 데이터를 대상으로 한 걸로만 나와서 cifar100 resnet이라고 검색해서 나온 깃헙을 참조해서 만들었습니다! 상당히 잘 정리된 레포라서 참고하시면 도움이 될 것 같습니다ㅎㅎ


위 레포에서 말하는 건 accuracy를 올리기 위해서 딱히 잡기술(?)들을 사용하지는 않았다고 합니다. 그런데도 resnet18의 top1 err가 24.39 즉 accuracy가 75.61정도 된다는 이야기겠네요. 으아 왜이렇게 차이가 많이 나는 걸까요 우선 여기서 구성한 아키텍쳐를 한 번 살펴보도록 하겠습니다. 

pytorch로 작성되어 있어서 조금 보기에 불편했지만 그래도 열심히 살펴보았는데, 정말 코드 짜는 법을 많이 배우게 되네요.. 아무튼! 살펴보면 다음과 같습니다.

Resnet의 사이즈가 올라가면 연산량을 줄이기 위해 bottleneck을 사용하는데, Resnet18의 경우 그렇게 사이즈가 크지 않기 때문에 따로 사용하지는 않습니다.

Shortcut의 기본 단위인 Basicblock은 conv2d - BN - Relu - Conv2d - BN으로 구성되어 있습니다. Conv2d는 단계가 깊어질수록 filter의 개수를 늘리고, filter의 개수가 늘어나면서 input size는 줄어듭니다. (사실 input size가 줄어듬에 따라 filter를 늘리는 게 맞겠죠.) kernel size는 3이고, stride는 1입니다. padding은 1로 주었습니다. (stride가 늘어날 때는 개수를 절반으로 유지하는 거고, stride가 1일 때는 same과 같습니다.)

결국 총 모델을 표시하면
Conv - BN - Relu - BasicBlock1(filter = 64) *2 - BasicBlock2(128) * 2 - BasicBlock3(256) * 2 - BasicBlock4(512) * 2 - AvgPool - FC
이 됩니다.

링크에서는 AdaptiveAvgPool을 사용하는데, kears에는 AdaptiveAvgPool이 없어서 그냥 AvgPool(4,4) 사용하고 flatten했습니다. 그리고 링크에서는 마지막 FC에 linear 사용했는데 저는 그냥 softmax 사용했습니다. (원래 쓰던 코드를 최대한 활용하기 위해...ㅠ)

코드는 돌려놨는데 모델 파라미터수라도 한번 체크할 겸 다시 확인해 보았습니다.

500만개 정도 되네요...흐음
예전에 돌렸던 모델이 파라미터 370만개 정도 되었다는 점을 고려하면 생각보다 그렇게 많지는 않은 것 같습니다. 시간도 예상했던 것보다는 적게 걸릴 듯 싶네요. 결과 보고 오겠습니다~~

에...?? 10시간을 돌려놨는데 Accuracy가 별로 안 좋게 나왔습니다. 제가 코드를 잘못 짠 것 같습니다. 어디서 문제가 생긴 건지 확인해야 하는데 이게 사실 제일 짜증나는 태스크... 으아 원래 짜놓았던 코드의 Accuracy보다도 안 좋게 나왔습니다. 흐음 그럼 문제를 발견하면 원래 만들어놓았던 모델의 Accuracy도 높게 만들 수 있다는 뜻인걸까요..? 아무튼 이번 글은 여기까지 하고 문제를 발견하고 나서 다시 오도록 하겠습니다. 나자신 화이팅...ㅠ

댓글 없음:

댓글 쓰기