본문 바로가기

AI & Big Data/AI

[Keras] SqueezeNet Model (CNN) 이란? - 1 (이론편)

반응형

서  론

머신러닝, 혹은 딥러닝을 공부하다 보면 '모델'이라는 개념이 등장한다.

주로 석/박사를 졸업하고 현업으로 AI직군을 들어가면 모델 설계 업무를 주로하게 된다.

 

요즘 모델의 트렌드는 주로 Accuracy, 즉 예측 정확성을 올리는 데에 집중되어 있다.

그렇기에 요즘 핫한 YOLOv3, Darknet, VGGNet 등등 예측 정확성은 매우 뛰어나다. 하지만 그 모델의 사이즈는 굉장히 무겁다.

가장 간단한 CNN 모델 중 하나인 AlexNet 같은 것조차, 사실 라즈베리파이나 스마트폰 등에 올리기 버거울 정도의 무게이다.

 

그래서 2016년 11월에 등장한 SqueezeNet은 임베디드 현장에서는 매우 큰 호평을 받게 되었다.

(SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size, Forrest N. Iandola, Song Han 외 4인 저, CVPR arXiv:1602.07360)

 

예를 들어, YoloV2의 경우 (416*416 기준) 모델의 weight size는 195MB에 이르고, YoloV2-tiny의 경우조차 모델의 weight size는 43MB나 된다.

 

SqueezeNet은 이러한 모델의 weight size를 (논문에 의하면) 0.5MB 이하로 낮출 수 있게 만들어준다.

실제 Application에서도 해당 모델링을 통한 SqueezeNet의 weight size는 0.5 ~ 2MB 정도가 나온다고 하니, 실제로 라즈베리파이나 비글본 등의 MPU에 온보드 실장이 가능할 것 같다.

 

즉, SqueezeNet은 스마트폰이나 저가형 하드웨어에서 이미지 처리를 하고 싶을 때 기존의 무거운 CNN 모델을 업로드하기 어렵기 때문에, 제한된 resource를 활용하여 빠른 prediction을 할 수 있게 만들어주는 모델이다.

 

이번 포스트의 목표는 SqueezeNet의 특성과 이론을 이해하고,

그것을 넘어서 keras를 통해 레이어를 쌓아서 SqueezeNet 모델링을 해보는 것을 도전해보겠다.


이  론

위 그림은 SqueezeNet을 포함한 CNN 딥러닝의 전체 흐름도로 참고하면 좋다

SqueezeNet은 AlexNet 수준의 Accuracy를 달성했지만 AlexNet보다 50배 작은 파라미터 수를 이용했고, 이는 hyper parameter를 어떻게 조합하느냐에 따라 성능이 어떻게 변하는가를 확인할 수 있는 좋은 예시이기도 하다.

 

1. SqueezeNet의 아키텍처

  • SqueezeNet은 8개의 fire module을 사용하고 I/O단에서 각각 1개의 Convolutional Layer를 사용한다.
  • 이 때 Fully Connected Layer는 전혀 사용되지 않았는데, 이는 Fully Connected Layer가 상당히 많은 양의 parameter를 지니고 있고, 이렇게 너무 많은 양의 parameter에 맞추다보면 overfitting이 발생할 왁률이 커지기 때문이다.
  • 그렇기에 SqueezeNet은 Fully Connected Layer 대신 Global Average Pooling을 사용함으로써 overfitting의 문제로부터 조금 더 자유로울 수 있다.
    • 단, Pooling Layer는 weight 값이 없기 때문에 model size를 크게 만들지는 않는다는 점이 주목할만하다.

일반적인 CNN 모델의 필터

위 그림과 같이, 일반적으로 CNN 모델은 3 x 3 필터를 주로 채용한다.

위 그림에서는 3개의 channel에서 3개의 Convolutional Filter를 사용하여 multiplication을 하고 그 결과를 모두 합하는 행위를 한다.

 

이 같은 경우에는 parameter의 수가 3 x 3 x No. of channels 가 된다.

 

조금 더 알아보기 쉬운 그림은 아래를 보면 된다.

일반적인 CNN 모델의 필터

그렇지만, SqueezeNet에서는 이러한 3 x 3 필터를 1 x 1 필터로 대체한다.

즉, 아래와 같은 그림처럼 된다.

SqueezeNet의 Filter

그렇기에 단순 계산으로도, parameter의 수는 No. of channels 밖에 되지 않고, 이는 일반적인 CNN 모델보다 parameter 수가 9배나 감소할 수 있음을 알 수 있다.

또한, SqueezeNet은 Convolutional Layer의 Activation Map을 크게 가지기 위해 Down Sampling을 늦게 한다.

만약 네트워크의 앞단에서 Down Sampling을 하게 되면 Activation Map의 크기가 줄어 연산량이 줄기 때문에 처리 속도는 빨라지지만 그만큼 정보가 손실되기 때문에 Accuracy는 낮아지게 된다.

하지만 Down Sampling 또한 늦게 한다면 Accuracy를 유지할 수 있는 전략이 된다.

 

2. Fire Module

SqueezeNet에서 Squeeze Layer는 1 x 1 Convolutional Filter를 통해 채널을 압축하고, Expand Layer에서 1 x 1 Convolutional Filter와 3 x 3 Convolutional Filter를 통해 다시 팽창시켜주는 역할을 한다.

 

Activation은 ReLu를 사용한다.

그렇게 하면 위와 같은 방식의 I/O가 이루어지게 된다.

즉, input으로 128개의 채널이 들어오면, 1 x 1을 통해서 16채널로 줄였다가, 다시 1 x 1을 통해 64개, 3 x 3을 통해 64개를 만들고, 이것을 통해 다시 128개의 채널 output을 만들게 된다.

 

SqueezeNet은 이러한 방식으로 모델의 weight size는 획기적으로 줄이면서, accuracy는 AlexNet과 동급, 혹은 그 이상인 모델을 설계할 수 있었다.


이론편을 마치며

SqueezeNet 논문에서 나온 SqueezeNet 모델의 알고리즘 흐름도

이제 위 다이어그램을 보면 어느 정도 SqueezeNet의 모델의 알고리즘을 이해할 수 있으리라 믿는다.

 

이로써 SqueezeNet의 기본을 이해해보았다.

다음 포스팅에서는 파이썬의 keras를 통해 레이어를 쌓고, 이를 통해 SqueezeNet의 모델링을 해보는 것을 도전해보고자 한다.

반응형